java多线程条件变量_Java基础之线程新特性条件变量

packageunit_fifteen;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;/*** Java线程:条件变量

**/

public classTest {public static voidmain(String[] args) {//创建并发访问的账户

MyCount myCount = new MyCount("95599200901215522", 10000);//创建一个线程池

ExecutorService pool = Executors.newFixedThreadPool(2);

Thread t1= new SaveThread("张三", myCount, 2000);

Thread t2= new SaveThread("李四", myCount, 3600);

Thread t3= new DrawThread("王五", myCount, 2700);

Thread t4= new SaveThread("老张", myCount, 600);

Thread t5= new DrawThread("老牛", myCount, 1300);

Thread t6= new DrawThread("胖子", myCount, 800);//执行各个线程

pool.execute(t1);

pool.execute(t2);

pool.execute(t3);

pool.execute(t4);

pool.execute(t5);

pool.execute(t6);//关闭线程池

pool.shutdown();

}

}/*** 存款线程类*/

class SaveThread extendsThread {private String name; //操作人

private MyCount myCount; //账户

private int x; //存款金额

SaveThread(String name, MyCount myCount,intx) {this.name =name;this.myCount =myCount;this.x =x;

}public voidrun() {

myCount.saving(x, name);

}

}/*** 取款线程类*/

class DrawThread extendsThread {private String name; //操作人

private MyCount myCount; //账户

private int x; //存款金额

DrawThread(String name, MyCount myCount,intx) {this.name =name;this.myCount =myCount;this.x =x;

}public voidrun() {

myCount.drawing(x, name);

}

}/*** 普通银行账户,不可透支*/

classMyCount {private String oid; //账号

private int cash; //账户余额

private Lock lock =new ReentrantLock(); //账户锁

private Condition _save = lock.newCondition(); //存款条件

private Condition _draw = lock.newCondition(); //取款条件

MyCount(String oid,intcash) {this.oid =oid;this.cash =cash;

}/*** 存款

*

*@paramx 操作金额

*@paramname 操作人*/

public void saving(intx, String name) {

lock.lock();//获取锁

if (x > 0) {

cash+= x; //存款

System.out.println(name + "存款" + x +",当前余额为" +cash);

}

_draw.signalAll();//唤醒所有等待线程。

lock.unlock(); //释放锁

}/*** 取款

*

*@paramx 操作金额

*@paramname 操作人*/

public void drawing(intx, 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{

lock.unlock();//释放锁

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值