java:lock中使用多个condition实现通知特定线程
来源:互联网 发布:江苏域名备案查询 编辑:程序博客网 时间:2024/05/21 14:08
相对于synchronized块中使用notify或者notifyall,通知的线程都是不确定的,当发一个通知,并不知道
下一个竞争到所得会是哪个线程。
而lock更加细腻,通过多个condition,则可以实现通知部分线程的功能。
service类:
package service;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class MyService {private Lock lock = new ReentrantLock();public Condition conditionA = lock.newCondition(); //两个conditionpublic Condition conditionB = lock.newCondition();public void awaitA() {try {lock.lock();System.out.println("begin awaitA时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());conditionA.await(); //用conditiona等待。System.out.println(" end awaitA时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void awaitB() {try {lock.lock();System.out.println("begin awaitB时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());conditionB.await();System.out.println(" end awaitB时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}}public void signalAll_A() {try {lock.lock();System.out.println(" signalAll_A时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());conditionA.signalAll(); //用a来打开。} finally {lock.unlock();}}public void signalAll_B() {try {lock.lock();System.out.println(" signalAll_B时间为" + System.currentTimeMillis()+ " ThreadName=" + Thread.currentThread().getName());conditionB.signalAll();} finally {lock.unlock();}}}
两个线程包装类:
package extthread;import service.MyService;public class ThreadA extends Thread {private MyService service;public ThreadA(MyService service) {super();this.service = service;}@Overridepublic void run() {service.awaitA();}}
package extthread;import service.MyService;public class ThreadB extends Thread {private MyService service;public ThreadB(MyService service) {super();this.service = service;}@Overridepublic void run() {service.awaitB();}}
运行类:
package test;import service.MyService;import extthread.ThreadA;import extthread.ThreadB;public class Run {public static void main(String[] args) throws InterruptedException {MyService service = new MyService();ThreadA a = new ThreadA(service);a.setName("A");a.start();ThreadB b = new ThreadB(service);b.setName("B");b.start();Thread.sleep(3000);service.signalAll_A();}}
当是conditionA等待时,conditionB的signal方法时无法唤醒的。
0 0
- java:lock中使用多个condition实现通知特定线程
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
- ReentrantLock使用Condition实现通知部分线程
- ReentrantLock使用Condition实现通知部分线程
- 多线程中使用Condition实现等待/通知
- 使用Lock和Condition来实现线程同步
- 多线程 : 使用Lock 和 Condition 实现线程间互斥与通信
- Java高级之Lock&Condition实现线程同步通信
- JAVA多线程—Lock&Condition实现线程同步通信
- java线程 使用显示的lock 和condition
- java5条件阻塞Condition的应用-多路等待通知Lock-Condition使用-笔记整理10
- Lock中Condition的实现
- Lock&Condition实现线程同步通信
- Lock和Condition实现线程同步通信
- Lock&Condition实现线程同步通信
- Lock和Condition实现线程同步通信
- Lock&Condition实现线程同步通信
- Lock&Condition实现线程同步通信
- Tomcat部署时war和war exploded区别以及平时踩得坑
- 《机器学习实战》(一)knn算法
- maven+Spring+SpringMVC+Mybatis 整合
- 浅谈Ajax中的GET和POST
- 关于Unity的表面着色器的学习
- java:lock中使用多个condition实现通知特定线程
- bootstrap modal 传值
- leetcodeOJ 442. Find All Duplicates in an Array
- 智能指针AutoPtr,ScopedPtr的模拟实现
- Mysql
- 【bzoj4816】[Sdoi2017]数字表格
- Hbase Region定位
- :before/:after和::before/::after的区别
- 微信小程序设计指南