package day12;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadDemo6 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Goods g=new Goods();
Produter p=new Produter(g);
Consumer c=new Consumer(g);
new Thread(p).start();
new Thread(p).start();
new Thread(c).start();
new Thread(c).start();
}
}
/*
* jdki.5 新特性
* 将synchronized 替换成 lock操作
* 将Object 的wait notify notifyall 替换成Condition对象
* 该对象可以通过lock 锁进行获取
* lock 替换了synchronized
* lock
* unlock
* newCondition
* Condition 替换了Object wait notify notifyall
* await signal signalall*/
class Goods
{
private String name;
private int count=0;
private boolean flag=false;
// 用这个来进行线程的锁和开
private Lock lock=new ReentrantLock();
// 用Condition来 控制线程的等待和唤醒
private Condition con_pro=lock.newCondition();
private Condition con_con=lock.newCondition();
public void set(String name)
{
lock.lock();
try {
while(flag)
con_pro.await();
this.name=name+"___"+count++;
System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
flag=true;
con_con.signal();
} catch (Exception e) {
// TODO: handle exception
}
finally
{
lock.unlock();
}
}
public void out()
{
lock.lock();
try {
while(!flag)
con_con.await();
System.out.println(Thread.currentThread().getName()+"消费者"+this.name );
flag=false;
con_pro.signal();
} catch (Exception e) {
// TODO: handle exception
}
finally
{
lock.unlock();
}
}
}
class Produter implements Runnable
{
private Goods g;
Produter(Goods g)
{
this.g=g;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
g.set("香蕉");
}
}
}
class Consumer implements Runnable
{
private Goods g;
Consumer(Goods g)
{
this.g=g;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
g.out();
}
}
}
多线程之间通信1.5的新特性 生产者消费者
最新推荐文章于 2022-10-17 22:09:41 发布