线程间协作的两种方式: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
原创粉丝点击