java 多个线程之间同步通信
2017-03-27 11:45
411 查看
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Lock 类似 synchronize (让多个线程 执行任务的时候 相互不干扰,不被打断 :互斥) * Condition (让多个线程之间 进行 交流 :通信) * * 例子 : 老大 --> 老二 -->老三 --> 老大 --> 老二 -->老三 */ public class ThreeConditionCommunication2 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub final Business bus=new ThreeConditionCommunication2().new Business(); new Thread( new Runnable(){ @Override public void run() { for (int j = 0; j < 5; j++) { bus.sub2(j); } } } ).start(); new Thread( new Runnable(){ @Override public void run() { for (int j = 0; j < 5; j++) { bus.sub3(j); } } } ).start(); for (int j = 0; j < 5; j++) { bus.sub1(j); } } //主要是这里不同 class Business{ Lock lock=new ReentrantLock(); Condition con1=lock.newCondition(); // 1 - 2 通信 Condition con2=lock.newCondition(); // 2 - 3 通信 int step=1; public void sub1(int i){ lock.lock(); try { while(step!=1) con1.await(); for (int j = 0; j < 100; j++) { System.out.println("main thread sequence of "+j+" loop of"+i); } step=2; con1.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } public void sub2(int i){ lock.lock(); try { while(step!=2) con1.await(); for (int j = 0; j < 10; j++) { System.out.println("Sub2 thread sequence of "+j+" loop of"+i); } step=3; con2.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } public void sub3(int i){ lock.lock(); try { while(step!=3) con2.await(); for (int j = 0; j < 20; j++) { System.out.println("Sub3 thread sequence of "+j+" loop of"+i); } step=1; con1.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } } }
/** * Lock 类似 synchronize (让多个线程 执行任务的时候 相互不干扰,不被打断 :互斥) * Condition (让多个线程之间 进行 交流 :通信) * * 例子 :三个线程之间的互斥 和 通信 */ public class ThreeConditionCommunication { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub final Business bus=new ThreeConditionCommunication().new Business(); new Thread( new Runnable(){ @Override public void run() { for (int j = 0; j < 5; j++) { bus.sub2(j); } } } ).start(); new Thread( new Runnable(){ @Override public void run() { for (int j = 0; j < 5; j++) { bus.sub3(j); } } } ).start(); for (int j = 0; j < 5; j++) { bus.sub1(j); } } // 三个 Condition class Business{ Lock lock=new ReentrantLock(); Condition con1=lock.newCondition(); Condition con2=lock.newCondition(); Condition con3=lock.newCondition(); int step=1; public void sub1(int i){ lock.lock(); try { while(step!=1) con1.await(); for (int j = 0; j < 20; j++) { System.out.println("main thread sequence of "+j+" loop of"+i); } step=2; con2.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } public void sub2(int i){ lock.lock(); try { while(step!=2) con2.await(); for (int j = 0; j < 10; j++) { System.out.println("Sub2 thread sequence of "+j+" loop of"+i); } step=3; con3.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } public void sub3(int i){ lock.lock(); try { while(step!=3) con3.await(); for (int j = 0; j < 20; j++) { System.out.println("Sub3 thread sequence of "+j+" loop of"+i); } step=1; con1.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } } }
相关文章推荐
- Java复习-线程之间的通信与同步
- java同步和互斥 : 线程之间通信
- 学习java多线程的笔记3-使用BlockingQueue阻塞队列来模拟两个线程之间的通信
- VC中利用多线程技术实现线程之间的通信(三)---线程之间的同步
- java 管道流的读写操作 用于两个线程之间的通信
- Java线程之间的通信
- 学习日记java 线程之间的同步
- java基础——多线程(线程的同步互斥与通信)
- java线程之间的通信
- java线程之间的通信
- java io 不同线程之间的通信
- java学习——如何实现线程之间的通信 ,Condition 的使用
- java学习之路——线程3(线程之间的通信)
- Java线程同步和线程间通信代码和控制线程关闭
- java线程间的同步与通信
- java 管道流的读写操作 用于两个线程之间的通信
- java 管道流的读写操作 用于两个线程之间的通信
- java多线程---线程之间的通信
- 黑马程序员——JAVA基础---线程之间的通信实现交替输出打印
- Java并发——线程间通信与同步技术