1、什么是线程定制化通信?
线程定制化通信就是让线程按照你想要的顺序来执行。
2、案例分析
3、代码演示
package com.ae.juc.threadNotify; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; //第一步:创建资源类,在资源类中创建属性和方法。 class ShareResource{ //定义标志位 private int flag = 1; //创建Lock锁 private Lock lock = new ReentrantLock(); //创建三个Condition private Condition c1 = lock.newCondition(); private Condition c2 = lock.newCondition(); private Condition c3 = lock.newCondition(); //打印5次,参数第几轮 public void print5(int loop) throws InterruptedException { //上锁 lock.lock(); try { //判断 while (flag != 1){ c1.await(); } //干活 for (int i = 1; i <= 5; i++) { System.out.println(Thread.currentThread().getName() + " :: "+i+" :轮数"+loop); } //通知 flag = 2; //先修改标志位 c2.signal(); //在通知BB线程 }finally { lock.unlock(); } } //打印10次,参数第几轮 public void print10(int loop) throws InterruptedException { //上锁 lock.lock(); try { //判断 while (flag != 2){ c2.await(); } //干活 for (int i = 1; i <= 10; i++) { System.out.println(Thread.currentThread().getName() + " :: "+i+" :轮数"+loop); } //通知 flag = 3; //先修改标志位 c3.signal(); //在通知CC线程 }finally { lock.unlock(); } } //打印15次,参数第几轮 public void print15(int loop) throws InterruptedException { //上锁 lock.lock(); try { //判断 while (flag != 3){ c3.await(); } //干活 for (int i = 1; i <= 15; i++) { System.out.println(Thread.currentThread().getName() + " :: "+i+" :轮数"+loop); } //通知 flag = 1; //先修改标志位 c1.signal(); //在通知AA线程 }finally { lock.unlock(); } } } public class LockNotifyDemo2 { public static void main(String[] args) { final ShareResource shareResource = new ShareResource(); new Thread(() -> { for (int i = 1; i <= 10; i++) { try { shareResource.print5(i); } catch (InterruptedException e) { e.printStackTrace(); } } },"AA").start(); new Thread(() -> { for (int i = 1; i <= 10; i++) { try { shareResource.print10(i); } catch (InterruptedException e) { e.printStackTrace(); } } },"BB").start(); new Thread(() -> { for (int i = 1; i <= 10; i++) { try { shareResource.print15(i); } catch (InterruptedException e) { e.printStackTrace(); } } },"CC").start(); } }