黑马程序员技术交流社区
标题:
求高手给我讲解一下等待唤醒机制
[打印本页]
作者:
李杰
时间:
2012-8-18 16:15
标题:
求高手给我讲解一下等待唤醒机制
举例说明,最好是毕老师的代码:)
作者:
左建飞
时间:
2012-8-18 17:00
public class InputOutputDemo2
{
public static void main(String[] args)
{
Res1 r=new Res1();
Thread t1=new Thread(new Input1(r));//1.创建了一个Input线程;
Thread t2=new Thread(new Output1(r));
//2.创建了一个Output线程;
t1.start();
t2.start();
}
}
class Res1
{
private String name;
private String sex;
private boolean flag=false;//初始标记为false;
public synchronized void set(String name,String sex)
{
if(flag)
try{this.wait();}catch(InterruptedException e){}
this.name=name;
this.sex=sex;
flag=true;
this.notify();
}
public synchronized void out()
{
if(!flag)
try{this.wait();}catch(InterruptedException e){}
System.out.println(name+"-----"+sex);
flag=false;
this.notify();
}
}
class Input1 implements Runnable
{
private Res1 r;
Input1(Res1 r)
{
this.r=r;
}
public void run()//3.假设t1先执行。
{
int x=0;
while(true)
{
if(x==0)
r.set("zhangsan","man");//4.到此调用set方法,flag为假,赋值。将flag置为true。
else
r.set("lisi","woman");//6.因为循环执行这个set方法,flag为真,当前线程wait(),并放弃this锁。t2开始执行。
x=(x+1)%2;//5.x由0变为1.
}
}
}
class Output1 implements Runnable
{
private Res1 r;
Output1(Res1 r)
{
this.r=r;
}
public void run()
{
while(true)
{
r.out();//(!flag)为flase,输出,flag置为假。循环,(!flag)为真,wait()。notify()将t1唤醒。
}
}
}
复制代码
这是只有两个线程的情况,当出现多线程时,便会出现错误。
在线程间通讯时使用Lock更为方便,更有针对性。
package day12;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ProducerCustomerDemo2
{
public static void main(String[] args)
{
Resource1 r=new Resource1();
Producer1 p=new Producer1(r);
Customer1 c=new Customer1(r);
Thread t1=new Thread(p);
Thread t2=new Thread(p);
Thread t3=new Thread(c);
Thread t4=new Thread(c);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Resource1
{
private String name;
private int count;
private boolean flag=false;
private Lock lock=new ReentrantLock();//1.5版本新特性。相当与synchronized语句。
//private Condition condition=lock.newCondition();//Condition相当与监视器方法,由lock的newCondition()方法获取。
private Condition condition_pro=lock.newCondition();//每个lock可以建立多个condition,它们可以互相等待唤醒。
private Condition condition_cus=lock.newCondition();
public void set(String name)throws InterruptedException
{
lock.lock();//上锁
try
{
while(flag)
condition_pro.await();//由await()替换wait()方法
this.name=name+"----"+count++;
System.out.println(Thread.currentThread().getName()+"...生产者。。。"+this.name);
flag=true;
condition_cus.signal();//由signal()替换notify(),由signalAll()替换notifyAll()。只唤醒消费方法;
}
finally
{
lock.unlock();
}
}
public void out()throws InterruptedException
{
lock.lock();
try
{
while(!flag)
condition_cus.await();
System.out.println(Thread.currentThread().getName()+"...消费者。。。。。。。。"+this.name);
flag=false;
condition_pro.signal();//只唤醒生产方法。
}
finally
{
lock.unlock();
}
}
}
class Producer1 implements Runnable
{
private Resource1 r;
Producer1(Resource1 r)
{
this.r=r;
}
public void run()
{
while(true)
{
try
{
r.set("商品");
}
catch(InterruptedException e){}
}
}
}
class Customer1 implements Runnable
{
private Resource1 r;
Customer1(Resource1 r)
{
this.r=r;
}
public void run()
{
while(true)
{
try
{
r.out();
}
catch(InterruptedException e){}
}
}
}
复制代码
作者:
黑马连家华
时间:
2012-8-18 17:28
我一般回答没人回答的简单问题..有人回答的我一般不看..可这样都抢不到分
作者:
黑马连家华
时间:
2012-8-25 12:42
黑马连家华 发表于 2012-8-18 17:28
我一般回答没人回答的简单问题..有人回答的我一般不看..可这样都抢不到分
张同学 此言差矣 技术分就像钱一样 越多越开心 别人会羡慕我的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2