线程间协作的两种方式:wait、notify、notifyAll和Condition
来源:互联网 发布:知行英语综合教程下载 编辑:程序博客网 时间:2024/06/17 01:12
参考这里学习:http://www.cnblogs.com/dolphin0520/p/3920385.html
举例:实现两个线程个循环50次,子循环10次,主循环100次。交替进行
public class TraditionalThread {public static void main(String[] args) { final Bussinse bus = new Bussinse();//线程1new Thread(new Runnable() {public void run() {for(int j=1;j<=50;j++){bus.sub(j);}}}).start();//线程2for(int j=1;j<=50;j++){bus.main(j);}}}class Bussinse{private boolean subRun=true;public synchronized void sub(int j){while(!subRun){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}for(int i=1;i<=10;i++){System.out.println(j+"==sub=="+i);}subRun=false;this.notify();}public synchronized void main(int j){while(subRun){try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}for(int i=1;i<=100;i++){System.out.println(j+"==main=="+i);}subRun=true;this.notify();}}
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ConditionTest {public static void main(String[] args) { final Bussinse bus = new Bussinse();//线程1new Thread(new Runnable() {public void run() {for(int j=1;j<=50;j++){bus.sub(j);}}}).start();//线程2for(int j=1;j<=50;j++){bus.main(j);}}}class Bussinse{Lock lock = new ReentrantLock();Condition condition = lock.newCondition();private boolean subRun=true;public void sub(int j){lock.lock();try{while(!subRun){try {condition.await();} catch (Exception e) {e.printStackTrace();}}for(int i=1;i<=10;i++){System.out.println(j+"==sub=="+i);}subRun=false;condition.signal();}finally{lock.unlock();}}public void main(int j){lock.lock();try{while(subRun){try {condition.await();} catch (Exception e) {e.printStackTrace();}}for(int i=1;i<=100;i++){System.out.println(j+"==main=="+i);}subRun=true;condition.signal();}finally{lock.unlock();}}}
举例:主线程运行100次后,唤醒线程2,运行10次,之后唤醒线程3运行10次,之后唤醒主线程运行100次。。以此类推,各循环50次
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class ThreeConditionTest {public static void main(String[] args) { final Bussinse bus = new Bussinse();//线程2new Thread(new Runnable() {public void run() {for(int j=1;j<=50;j++){bus.sub2(j);}}}).start();//线程3new Thread(new Runnable() {public void run() {for(int j=1;j<=50;j++){bus.sub3(j);}}}).start();//线程1for(int j=1;j<=50;j++){bus.main(j);}}}class Bussinse{Lock lock = new ReentrantLock();Condition condition1 = lock.newCondition();Condition condition2 = lock.newCondition();Condition condition3 = lock.newCondition();private int shouldSub = 1;public void sub2(int j){lock.lock();try{while(shouldSub!=2){try {condition2.await();} catch (Exception e) {e.printStackTrace();}}for(int i=1;i<=10;i++){System.out.println(j+"==sub2=="+i);}shouldSub = 3;condition3.signal();}finally{lock.unlock();}}public void sub3(int j){lock.lock();try{while(shouldSub!=3){try {condition3.await();} catch (Exception e) {e.printStackTrace();}}for(int i=1;i<=10;i++){System.out.println(j+"==sub3=="+i);}shouldSub = 1;condition1.signal();}finally{lock.unlock();}}public void main(int j){lock.lock();try{while(shouldSub!=1){try {condition1.await();} catch (Exception e) {e.printStackTrace();}}for(int i=1;i<=100;i++){System.out.println(j+"==main=="+i);}shouldSub=2;condition2.signal();}finally{lock.unlock();}}}
阅读全文
0 0
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- java并发编程(13)--线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- 线程间协作的两种方式:wait、notify、notifyAll和Condition
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- 线程间协作的两种方式:wait、notify、notifyAll和Condition
- 简要记录ES6中Module的语法
- 10. Regular Expression Matching
- 数学建模专栏 | 第六篇:MATLAB优化模型求解方法(下):全局优化
- Bootstrap常用样式类(v3.3.4)
- jQuery获取父级元素、子级元素、兄弟元素的方法
- 线程间协作的两种方式:wait、notify、notifyAll和Condition
- 接水问题
- ROT5/13/18/47 密码
- 类型的Overflow与underflow
- 集合(4)刘备 map
- 排序算法——归并排序
- 使用virtualenv Django 创建应用程序的前期配置
- 浅谈React
- 菜鸟Python(5)