JUC练习3——lock实现精准唤醒demo
实现精准唤醒:A执行后,B执行,B执行后C执行,C执行后A执行——》针对多线程下生产流水线问题,例如:C需要执行必须完成B操作,B操作需要执行必须要完成A操作
代码示例如下所示:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class test { public static void main(String[] args) { Data data = new Data(); new Thread(()->{ for (int i=1;i<=10;i++) { data.printA(); } },"线程A").start(); new Thread(()->{ for (int i=1;i<=10;i++) { data.printB(); } },"线程B").start(); new Thread(()->{ for (int i=1;i<=10;i++) { data.printC(); } },"线程C").start(); } } class Data { private String executor = "A"; //标识,当前可执行的操作 private Lock lock = new ReentrantLock(); //锁,为了使得多个操作同步进行,这三个操作公用一把锁 private Condition conditionA = lock.newCondition(); //A操作的等待唤醒 private Condition conditionB = lock.newCondition(); //B操作的等待唤醒 private Condition conditionC = lock.newCondition(); //C操作的等待唤醒 public void printA() { lock.lock();//上锁 try { while (executor!="A")//使用while判断不使用if判断,防止虚假唤醒 { conditionA.await(); } executor="B";//指定下一个操作者 conditionB.signal();//将其唤醒 System.out.println(Thread.currentThread().getName()+"执行了,唤醒B"); }catch (Exception e) { e.printStackTrace(); } finally { lock.unlock();//shi释放占有的锁 } } public void printB() { lock.lock(); try { while (executor!="B") { conditionB.await(); } executor="C"; conditionC.signal(); System.out.println(Thread.currentThread().getName()+"执行了,唤醒C"); }catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } public void printC() { lock.lock(); try { while (executor!="C") { conditionC.await(); } executor="A"; conditionA.signal(); System.out.println(Thread.currentThread().getName()+"执行了,唤醒A"); }catch (Exception e) { e.printStackTrace(); } finally { lock.unlock(); } } }