Condition实现精准通知唤醒
package com.han.demo01; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class TestCondition { public static void main(String[] args) { Data02 data = new Data02(); new Thread(() -> { for (int i = 0; i < 10; i++) { data.printA(); } }, "A").start(); new Thread(() -> { for (int i = 0; i < 10; i++) { data.printB(); } }, "B").start(); new Thread(() -> { for (int i = 0; i < 10; i++) { data.printC(); } }, "B").start(); } } class Data02 { private Lock lock = new ReentrantLock(); //给每个线程一个监视器 Condition conditionA = lock.newCondition(); Condition conditionB = lock.newCondition(); Condition conditionC = lock.newCondition(); private int num = 1; public void printA() { lock.lock(); try { while (num != 1) { conditionA.await(); } System.out.println(Thread.currentThread().getName() + "=====>AAA"); num = 2; conditionB.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void printB() { lock.lock(); try { while (num != 2) { conditionB.await(); } System.out.println(Thread.currentThread().getName() + "=====>BBB"); num = 3; conditionC.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void printC() { lock.lock(); try { while (num != 3) { conditionC.await(); } System.out.println(Thread.currentThread().getName() + "=====>ccc"); num = 1; conditionA.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }
上一篇:
IDEA上Java项目控制台中文乱码