Java code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package
ThreadTest;
import
java.util.ArrayList;
import
java.util.List;
public
class
FirstThread {
static
List<Object> goods =
new
ArrayList<>();
//储存物品的仓库,最多储存1
public
static
void
main(String[] args)
throws
InterruptedException {
Producer thread1 =
new
Producer();
Consumer thread2 =
new
Consumer();
Thread p1 =
new
Thread(thread1,
"生产者1"
);
Thread p2 =
new
Thread(thread1,
"生产者2"
);
Thread p3 =
new
Thread(thread1,
"生产者3"
);
Thread c1 =
new
Thread(thread2,
"消费者1"
);
Thread c2 =
new
Thread(thread2,
"消费者2"
);
Thread c3 =
new
Thread(thread2,
"消费者3"
);
p1.start();
p2.start();
p3.start();
c1.start();
c2.start();
c3.start();
}
static
class
Producer
implements
Runnable {
@Override
public
void
run() {
// TODO Auto-generated method stub
int
num =
0
;
while
(
true
) {
synchronized
(goods) {
if
(goods.size()==
0
) {
goods.add(
"商品"
+ ++num);
System.out.println(Thread.currentThread().getName()+
"生产了第"
+num+
"个产品"
);
}
else
if
(goods.size()>
0
)
try
{
goods.wait();
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try
{
Thread.sleep(
100
);
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
static
class
Consumer
implements
Runnable {
@Override
public
void
run() {
// TODO Auto-generated method stub
int
num =
0
;
while
(
true
) {
synchronized
(goods) {
if
(goods.size()>
0
) {
goods.remove(
"商品"
+ ++num);
System.out.println(Thread.currentThread().getName()+
"消费了第"
+num+
"个产品"
);
}
else
if
(goods.size()==
0
)
goods.notify();;
}
try
{
Thread.sleep(
100
);
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
为什么所有的生产者不是共用一个num,输出时每个生产者都会输出1,2...。我按照书上的例子可以实现共享,是不是这里是内部类的问题,但是如果不用内部类我又怎么实现生产者和消费者之间的通信呢,
顺便再问一个问题,那就是我按照书上的例子敲的,但是每次执行的结果都是几乎由一个窗口完成全部售票,没有达到上下两张票的窗口一定不同,代码如下:
按理来说sleep(100)会保证不让同一线程连续执行
Java code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package
ThreadTest;
class
SaleThread2
implements
Runnable {
int
tickets =
10
;
Object lock =
new
Object();
@Override
public
void
run() {
// TODO Auto-generated method stub
while
(
true
) {
synchronized
(lock) {
if
(tickets>
0
) {
try
{
Thread.sleep(
100
);
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+
"正在出售第"
+tickets-- +
"张票"
);
}
}
}
}
}
public
class
Example12 {
public
static
void
main(String[] args) {
SaleThread2 st =
new
SaleThread2();
new
Thread(st,
"窗口1"
).start();
new
Thread(st,
"窗口2"
).start();
new
Thread(st,
"窗口3"
).start();
new
Thread(st,
"窗口4"
).start();
}
应该定义一个数据类,线程类实现Runnable接口,共享数据。
第一个问题,肯定不是内部类导致的,你声明的 num 是一个局部变量,肯定每个线程独立。除非你也把它和 goods 一样变成一个静态的成员变量。
第二个问题,代码逻辑上没啥问题,你可以试着把票弄多点,或者先把所有的线程new好,然后在最后再 .start
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y