import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class CocurrencyCondition {    public static void main(String...args){
//        創建并發訪問的帳戶
        MyCount3 myCount = new MyCount3("1234567890",0);
//        創建一個線程池
        ExecutorService pool = Executors.newFixedThreadPool(2);
        Thread t1 = new SaveThread("A",myCount,2000);
        Thread t2 = new SaveThread("B",myCount,3000);
        Thread t3 = new DrawThread("C",myCount,6000);
        Thread t4 = new DrawThread("D",myCount,1000);
//        執行各個線程
        pool.execute(t3);
        pool.execute(t4);
        pool.execute(t1);
        pool.execute(t2);
//        關閉線程池
        pool.shutdown();
    }
}//
class SaveThread extends Thread{
    private String name;//操作人
    private MyCount3 myCount;//帳戶
    private int x;//存款金額
    
    SaveThread(String name,MyCount3 myCount,int x){
        this.name = name;
        this.myCount = myCount;
        this.x = x;
    }
    @Override
    public void run(){
        myCount.saving(x,name);
    }
}class DrawThread extends Thread{
    private String name;//操作人
    private MyCount3 myCount;//帳戶
    private int x;//存款金額
    
    DrawThread(String name,MyCount3 myCount,int x){
        this.name = name;
        this.myCount = myCount;
        this.x = x;
    }
    @Override
    public void run(){
        myCount.drawing(x,name);
    }
}class MyCount3{
    private String oid;//帳戶
    private int cash;//帳戶餘額
    private Lock lock = new ReentrantLock();
    private Condition _save = lock.newCondition();//存款條件
    private Condition _draw = lock.newCondition();//取款條件
    
    MyCount3(String oid,int cash){
        this.oid = oid;
        this.cash = cash;
        System.out.println(_save==_draw);
    }
    
    public void saving(int x,String name){
        lock.lock();//獲取鎖
        if(x>0){
            cash += x;//存款
            System.out.println(name+"存款"+x+",當前餘額為"+cash);
        }
        _draw.signalAll();//喚醒所有取款線程
        lock.unlock();//釋放鎖
    }
    public void drawing(int x,String name){
        lock.lock();
        try{
            if(cash-x<0){
                _draw.await();
            }else{
                cash -= x;
                System.out.println(name+"取款"+x+",當前餘額為"+cash);
            }
            _save.signalAll();//喚醒所有存款線程
        }catch(InterruptedException e){
            e.printStackTrace();
        }finally{
            if(lock.tryLock()){
                lock.unlock();
            }
        }
    }
}
在pool中,t3,t4比t1,t2先執行的話就一直等待,t1,t2并不會被執行。而Condition.await會釋放lock的。
請問為什麽?

解决方案 »

  1.   

    你先执行取款的线程,这个时候还没有钱,就被挂起了(_draw.await();)
    这两个取款线程一直没退出去,而你开的线程池最多只能同时执行两个线程,存款的线程当然不会被执行了
      

  2.   

    ExecutorService pool = Executors.newFixedThreadPool(2);
    把2改成4就可以了
      

  3.   

    to  baiydn:
    改了也不行,你可以多運行幾次就又會出現等待了
      

  4.   


    if(cash-x<0){
                    _draw.await();
                }else{
                    cash -= x;
                    System.out.println(name+"取款"+x+",當前餘額為"+cash);
                }你这个取款写的有问题
    这个线程只执行了一次,你用if else 不是等待就是取款
    而且进入等待被唤醒之后,啥都没干,当然不会打印"取款"了