4.1.5ReentrantLock与Condition选择性的唤醒线程
2017-10-18 12:04
316 查看
package demo; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * Created by sunyifeng on 17/10/18. */ public class MyService { private Lock lock = new ReentrantLock(); private Condition conditionA = lock.newCondition(); private Condition conditionB = lock.newCondition(); public void awaitA() { try { lock.lock(); System.out.println("awaitA开始等待的时间为:" + System.currentTimeMillis()); conditionA.await(); // FIXME:等同于wait System.out.println("awaitA结束等待的时间为:" + System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); System.out.println("awaitA锁释放了"); } } public void awaitB() { try { lock.lock(); System.out.println("awaitB开始等待的时间为:" + System.currentTimeMillis()); conditionB.await(); // FIXME:等同于wait System.out.println("awaitB结束等待的时间为:" + System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); System.out.println("awaitB锁释放了"); } } public void signalA(){ try { lock.lock(); System.out.println("开始通知锁A的时间为:" + System.currentTimeMillis()); conditionA.signalAll(); // FIXME:等同于notify } finally { lock.unlock(); } } public void signalB(){ try { lock.lock(); System.out.println("开始通知锁B的时间为:" + System.currentTimeMillis()); conditionB.signalAll(); // FIXME:等同于notify } finally { lock.unlock(); } } }
package demo; /** * Created by sunyifeng on 17/10/18. */ public class ThreadA extends Thread { private MyService myService; public ThreadA(MyService myService) { super(); this.myService = myService; } @Override public void run() { super.run(); myService.awaitA(); } }
package demo; /** * Created by sunyifeng on 17/10/18. */ public class ThreadB extends Thread { private MyService myService; public ThreadB(MyService myService) { super(); this.myService = myService; } @Override public void run() { super.run(); myService.awaitB(); } }
package demo; /** * Created by sunyifeng on 17/10/18. */ public class Run { public static void main(String[] args) throws InterruptedException { MyService myService = new MyService(); ThreadA threadA = new ThreadA(myService); threadA.setName("A"); threadA.start(); ThreadB threadB = new ThreadB(myService); threadB.setName("B"); threadB.start(); // Thread.sleep(3000); myService.signalA(); } }
运行结果:
awaitA开始等待的时间为:1508299350742
awaitB开始等待的时间为:1508299350743
开始通知锁A的时间为:1508299353747
awaitA结束等待的时间为:1508299353748
awaitA锁释放了
程序分析:
有两个线程都是等待状态,condition有选择性的唤醒了线程A,线程B仍然处于等待状态。
相关文章推荐
- (三)juc高级特性——虚假唤醒 / Condition / 按序交替 / ReadWriteLock / 线程八锁
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】
- 线程间通信、等待唤醒机制、生产者消费者问题(Lock,Condition)、停止线程和守护线程、线程优先级
- 【Java线程】锁机制:synchronized、Lock、Condition
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- JAVA线程锁lock下Condition高级使用-多个Condition的整合使用
- day12线程间的通信,等待唤醒机制,生产者消费者问题。新锁lock(): 守护线程,interrupt()停止线程用,join()yield()
- Java5线程并发库之LOCK(锁)&CONDITION(条件)实现线程同步通信
- Java线程---锁机制:synchronized、Lock、Condition
- 多线程 : 使用Lock 和 Condition 实现线程间互斥与通信
- 【Java线程】锁机制:synchronized、Lock、Condition
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例
- java基础巩固---(线程)锁机制:synchronized、Lock、Condition
- 【Java并发系列04】线程锁synchronized和Lock和volatile和Condition
- 【Java线程】锁机制:synchronized、Lock、Condition
- 线程锁ReentrantLock和Condition的使用
- java并发包中的Condition和Lock 取代Synchronized、wait、notify/notifyAll实现线程的同步与互斥
- 线程___jdk_1.5___Lock__Condition
- 线程通信之jdk1.5之后lock,condition