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的。
請問為什麽?
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的。
請問為什麽?
这两个取款线程一直没退出去,而你开的线程池最多只能同时执行两个线程,存款的线程当然不会被执行了
把2改成4就可以了
改了也不行,你可以多運行幾次就又會出現等待了
if(cash-x<0){
_draw.await();
}else{
cash -= x;
System.out.println(name+"取款"+x+",當前餘額為"+cash);
}你这个取款写的有问题
这个线程只执行了一次,你用if else 不是等待就是取款
而且进入等待被唤醒之后,啥都没干,当然不会打印"取款"了