package duoxiancheng;
//JDK5升级版ProducerCustomer模型
import java.util.concurrent.locks.*;
class Ress
{
private String name;
private int counnt=1;
private boolean flag=false;
private Lock lock=new ReentrantLock();//建立锁对象
private Condition condition_1=lock.newCondition();//condition好处,可以添加多个,从而避免将所有线程唤醒浪费资源
private Condition condition_2=lock.newCondition();
public void set(String name) throws InterruptedException
{
lock.lock();//锁
try{
while(flag)
condition_1.await();//01线程等待
this.name=name+"..."+counnt++;
System.out.println(Thread.currentThread().getName()+"..."+this.name);//此处要加name要加this
flag=true;
condition_2.signal();//23线程唤醒
}
finally{
lock.unlock();//为了预防await异常而线程终端但还没有解锁其它线程进不来,所以要用finally解锁
}
}
public void out() throws InterruptedException
{
lock.lock();
try{
while(!flag)
condition_2.await();
System.out.println(Thread.currentThread().getName()+"......"+name);
flag=false;
condition_1.signal();
}finally{
lock.unlock();
}
}
}
class ProducerU implements Runnable
{
Ress r;
ProducerU(Ress r)
{
this.r=r;
}
public void run()
{
try {
while(true)//此while语句要包含在try中
r.set("good");
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
class CustomerU implements Runnable
{
Ress r;
CustomerU(Ress r)
{
this.r=r;
}
public void run()
{
try {
while(true)
r.out();
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}
public class ProducerCustomerJDK_5 {
public static void main(String [] args)
{
Ress r=new Ress();
new Thread(new ProducerU(r)).start();
new Thread(new ProducerU(r)).start();
new Thread(new CustomerU(r)).start();
new Thread(new CustomerU(r)).start();
}
}
(多线程)ProducerCustomerJDK_5
最新推荐文章于 2020-03-09 11:55:42 发布