线程通信

xiaopeng0803 2014-01-04 08:21:12
在类P中定义一个新的成员变量bFull来表示数据存储空间的状态,当Consumer线程取走数据后,bFull值为false,当Producer线程放入数据后,bFull值为true。只有bFull为true时,Consumer线程才能取走数据,否则就必须等待Producer线程放入新的数据后的通知;反之,只有bFull为false,Producer线程才能放入新的数据,否则就必须等待Consumer线程取走数据后的通知。修改后的P类的程序代码如下:

01 class P
02 {
03 private String name="李四";
04 private String sex="女";
05 boolean bFull = false ;
06 public synchronized void set(String name,String sex)
07 {
08 if(bFull)
09 {
10 try
11 {
12 wait() ; // 后来的线程要等待
13 }
14 catch(InterruptedException e)
15 {}
16 }
17 this.name = name ;
18 try
19 {
20 Thread.sleep(10);
21 }
22 catch(Exception e)
23 {
24 System.out.println(e.getMessage());
25 }
26 this.sex = sex ;
27 bFull = true ;
28 notify(); // 唤醒最先到达的线程
29 }
30 public synchronized void get()
31 {
32 if(!bFull)
33 {
34 try
35 {
36 wait() ;
37 }
38 catch(InterruptedException e)
39 {}
40 }
41 System.out.println(name+" ---->"+sex);
42 bFull = false ;
43 notify();
44 }
45 }

在一本书上看到 上述说明和下面的代码,在上面的说明,我的理解是 当bFull 为true时取,为flase时写,从下面的代码我理解正反是相反了,是不是书上错了,还是理解有问题。
...全文
104 点赞 收藏 2
写回复
2 条回复
瓜瓜东西 2014年01月09日
这个应该是个生产者消费者多线程并发问题吧,最好自己写个例子,像这种逻辑强的例子最好自己写,才有自己的思路,这个是不好理解的
回复 点赞
xiaoliuliu2050 2014年01月04日
你理解错了 ture 时候,证明有数据,所以 set 方法 等待 false 时候 证明没有数据,所以get 方法等待。
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告