黑马程序员技术交流社区
标题:
多线程通信
[打印本页]
作者:
左华清
时间:
2012-2-22 18:35
标题:
多线程通信
本帖最后由 左华清 于 2012-2-23 11:40 编辑
想实现"zhangshan:male","lisi:female"
老报错,请大家指点下!
package cn.itcast.threadtest;
public class ThreadCommunation {
public static void main(String[]args){
Q q=new Q();
new Thread(new Producer(q)).start();
new Thread(new Consumer(q)).start();
}
}
class Producer implements Runnable{
Q q;
public Producer(Q q){
this.q=q;
}
public void run(){
int i=0;
while(true){
synchronized(q){
if(q.bFull){
try{wait();}catch(Exception e){};
}
if(i==0){
q.name="zhangshan";
try{Thread.sleep(1);}catch(Exception e){};
q.sex="male";
}else{
q.name="lisi";
q.sex="female";
}
q.bFull=true;
notify();
}
i=(i+1)%2;
}
}
}
class Consumer implements Runnable{
Q q;
public Consumer(Q q){
this.q=q;
}
public void run(){
while(true){
synchronized(q){
if(!q.bFull){
try{wait();}catch(Exception e){};
}
System.out.print(q.name);
System.out.println(":"+q.sex);
q.bFull=false;
notify();
}
}
}
}
class Q{
public String name="unknown";
public String sex="unknown";
public boolean bFull=false;
}
作者:
沈样
时间:
2012-2-22 22:42
这里锁对象的问题, synchronized(q)锁是Q,你notify应该也是q,改成q.notify()就可以运行了
作者:
左华清
时间:
2012-2-23 11:39
嗯,谢谢!
真是这样子的,解决了!
作者:
马胜平
时间:
2012-2-23 12:12
只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒。
不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2