线程间的定制化通信
需求:
分析:
代码的实现:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class Resource { //1.定义标示位 private int flag = 1;//flag=1 AA flag=2 BB flag=3 CC private Lock lock = new ReentrantLock(); private Condition condition1 = lock.newCondition(); private Condition condition2 = lock.newCondition(); private Condition condition3 = lock.newCondition(); //打印5次,参数第几轮 public void print5(int loop) throws InterruptedException { lock.lock(); try { while (flag != 1) { condition1.await(); } //干活 for (int i = 1; i <= 5; i++) { System.out.println(Thread.currentThread().getName() + "::次数:" + i + "轮数:" + loop); } //修改标志位为2 flag = 2; condition2.signal(); } finally { lock.unlock(); } } //打印10次,参数第几轮 public void print10(int loop) throws InterruptedException { lock.lock(); try { while (flag != 2) { condition2.await(); } //干活 for (int i = 1; i <= 10; i++) { System.out.println(Thread.currentThread().getName() + "::次数:" + i + "轮数:" + loop); } //修改标志位为3 flag = 3; condition3.signal(); } finally { lock.unlock(); } } //打印10次,参数第几轮 public void print15(int loop) throws InterruptedException { lock.lock(); try { while (flag != 3) { condition3.await(); } //干活 for (int i = 1; i <= 15; i++) { System.out.println(Thread.currentThread().getName() + "::次数:" + i + "轮数:" + loop); } //修改标志位为2 flag = 1; condition1.signal(); } finally { lock.unlock(); } } } public class ThreadDemo { public static void main(String[] args) { Resource resource = new Resource(); new Thread(() -> { for (int i = 1; i <= 10; i++) { try { resource.print5(i); } catch (InterruptedException e) { e.printStackTrace(); } } }, "AA").start(); new Thread(() -> { for (int i = 1; i <= 10; i++) { try { resource.print10(i); } catch (InterruptedException e) { e.printStackTrace(); } } }, "BB").start(); new Thread(() -> { for (int i = 1; i <= 15; i++) { try { resource.print15(i); } catch (InterruptedException e) { e.printStackTrace(); } } }, "CC").start(); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)