黑马程序员——Java基础---线程的另一个总结(7)--condition,await
2015-07-04 20:44
761 查看
与前边的通讯互斥的synchronized与wait相同
这里使用condition与await相同
实现三线程互斥
这里使用condition与await相同
public class ConditionCommunication { /** * @param args */ public static void main(String[] args) { final Business business = new Business(); new Thread( new Runnable() { @Override public void run() { for(int i=1;i<=50;i++){ business.sub(i); } } } ).start(); for(int i=1;i<=50;i++){ business.main(i); } } static class Business { Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); private boolean bShouldSub = true; public void sub(int i){ lock.lock(); try{ while(!bShouldSub){ try { condition.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1;j<=10;j++){ System.out.println("sub thread sequence of " + j + ",loop of " + i); } bShouldSub = false; condition.signal(); }finally{ lock.unlock(); } } public void main(int i){ lock.lock(); try{ while(bShouldSub){ try { condition.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1;j<=100;j++){ System.out.println("main thread sequence of " + j + ",loop of " + i); } bShouldSub = true; condition.signal(); }finally{ lock.unlock(); } } } }
实现三线程互斥
public class ThreeConditionCommunication { /** * @param args */ public static void main(String[] args) { final Business business = new Business(); new Thread( new Runnable() { @Override public void run() { for(int i=1;i<=50;i++){ business.sub2(i); } } } ).start(); new Thread( new Runnable() { @Override public void run() { for(int i=1;i<=50;i++){ business.sub3(i); } } } ).start(); for(int i=1;i<=50;i++){ business.main(i); } } static class Business { Lock lock = new ReentrantLock(); Condition condition1 = lock.newCondition(); Condition condition2 = lock.newCondition(); Condition condition3 = lock.newCondition(); private int shouldSub = 1; public void sub2(int i){ lock.lock(); try{ while(shouldSub != 2){ try { condition2.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1;j<=10;j++){ System.out.println("sub2 thread sequence of " + j + ",loop of " + i); } shouldSub = 3; condition3.signal(); }finally{ lock.unlock(); } } public void sub3(int i){ lock.lock(); try{ while(shouldSub != 3){ try { condition3.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1;j<=20;j++){ System.out.println("sub3 thread sequence of " + j + ",loop of " + i); } shouldSub = 1; condition1.signal(); }finally{ lock.unlock(); } } public void main(int i){ lock.lock(); try{ while(shouldSub != 1){ try { condition1.await(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } for(int j=1;j<=100;j++){ System.out.println("main thread sequence of " + j + ",loop of " + i); } shouldSub = 2; condition2.signal(); }finally{ lock.unlock(); } } } }
相关文章推荐
- 黑马程序员——OC基础学习(五)---分类(Category),代码块Block和protocol代理设计模式
- Java面试求职之Java编程基础
- 面试题29:数组中出现次数超过一半的数字
- 一次面试失败的收获
- 程序员需要知道的10大编程格言
- 黑马程序员-面向对象
- 黑马程序员——Java基础---线程的另一个总结(6)--线程读写锁,缓存小例子
- 漫谈程序员系列:怎么告别“混日子”
- 转载面试
- 找出字符串中第1个只出现1次的字符
- 黑马程序员——Java基础---线程的另一个总结(5)--线程池,线程定时器
- 面试题25:二叉树中和为某一值的路径
- 黑马程序员——函数
- 黑马程序员——程序流程控制
- 黑马程序员——关键字,标识符,注释,常量,变量
- [心得]传统IT转互联网面试经验分享
- java面试题及答案(基础题122道,代码题19道)
- Java面试宝典2015版
- 黑马程序员---IO流
- 黑马程序员---正则表达式