package thread;
import java.util.concurrent.locks.*;
import java.util.concurrent.locks.Lock;
/**
* JDK1.5以后对多线程间通信的等待唤醒机制进行了升级 新特性
* 将同步关键字Synchronized替换成显示Lock操作
* 将Object中的wait(),notify(),notifyAll()替换成了Condition对象
* 该对象可以对Lock锁进行获取
* 该实例中,实现了只唤醒对方的操作
* @author wjw
*
*/
public class Procedure_Customer_Up{
public static void main(String[] args) {
Resource_up res=new Resource_up();
Procedure_up pro=new Procedure_up(res);
Procedure_up pro1=new Procedure_up(res);
Customer_up cus=new Customer_up(res);
Customer_up cus1=new Customer_up(res);
new Thread(pro).start();
new Thread(pro1).start();
new Thread(cus).start();
new Thread(cus1).start();
}
}
class Resource_up{
private String name;
private int count=1;
private boolean boo;
private Lock lock=new ReentrantLock();//创建锁,一个锁可以对应多个Condition对象
private Condition condition_pro=lock.newCondition();//锁对应的状态一
private Condition condition_cus=lock.newCondition();//锁对应的状态二
public void setNameCount(String name){
lock.lock();
try{
while(boo){
try{
condition_pro.await();
}catch(Exception e){
e.printStackTrace();
}
}
this.name=name+",,,"+count++;
System.out.println("生产者:"+this.name);
boo=true;
condition_cus.signal();
}finally{
lock.unlock();//释放锁的动作一定要执行
}
}
public synchronized void out(){
lock.lock();
try{
while(!boo){
try{
condition_cus.await();
}catch(Exception e){
e.printStackTrace();
}
}
System.out.println("============消费者======"+this.name);
boo=false;
condition_pro.signal();
}finally{
lock.unlock();
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name+"..."+count++;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public boolean isBoo() {
return boo;
}
public void setBoo(boolean boo) {
this.boo = boo;
}
}
class Procedure_up implements Runnable{
private Resource_up res;
public Procedure_up(Resource_up res){
this.res=res;
}
public void run(){
while(true){
res.setNameCount("abc");
}
}
}
class Customer_up implements Runnable{
private Resource_up res;
public Customer_up(Resource_up res){
this.res=res;
}
public void run(){
while(true){
res.out();
}
}
}