廖雪峰Java11多线程编程-3高级concurrent包-3Condition
2024-09-08 01:27:48
1.Condition实现等待和唤醒线程
java.util.locks.ReentrantLock用于替代synchronized加锁
但是synchronized可以使用wait和notify实现线程在条件不满足时的等待,条件满足时的唤醒。
如何使用ReentrantLock实现wait/notify的功能?
这个时候我们可以使用Condition对象来实现条件不满足时的等待,条件满足时的唤醒。
class TaskQueue{
final Lock lock = new ReentrantLock()
final Condition notEmpty = lock.newCondition();
}
1.1 对Condition对象调用await()方法就相当于对所对象调用wait()方法。
### 1.2 对Condition对象调用signalAll()就相当于在synchronized加锁对象调用notifyAll()方法。
Condition.await/signal/signalAll原理和wait/notify/notifyAll一致
* await()会释放当前锁,进入等待状态
* signal()会唤醒某个等待线程
* signalAll()会唤醒所有等待线程
* 唤醒线程从await()返回后需要重新获得锁
2. 示例
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class TaskQueue{
final Queue<String> queue = new LinkedList<>();
final Lock lock = new ReentrantLock();
final Condition notEmpty = lock.newCondition();
public String getTask() throws InterruptedException{
lock.lock();
try{
while(this.queue.isEmpty()){
notEmpty.await();
}
return queue.remove();
}finally {
lock.unlock();
}
}
public void addTask(String name){
lock.lock();
try{
this.queue.add(name);
notEmpty.signalAll();
}finally {
lock.unlock();
}
}
}
class WorkerThread extends Thread{
TaskQueue taskQueue;
public WorkerThread(TaskQueue taskQueue){
this.taskQueue = taskQueue;
}
public void run(){
while(!isInterrupted()){
String name;
try{
name = taskQueue.getTask();
}catch (InterruptedException e){
break;
}
String result = "Hello, "+name+" !";
System.out.println(result);
}
}
}
public class Main{
public static void main(String[] args) throws InterruptedException{
TaskQueue taskQueue = new TaskQueue();
WorkerThread worker = new WorkerThread(taskQueue);
worker.start();
taskQueue.addTask("Bob");
Thread.sleep(1000);
taskQueue.addTask("Alice");
Thread.sleep(1000);
taskQueue.addTask("Tim");
Thread.sleep(1000);
worker.interrupt();
worker.join();
System.out.println("END");
}
}
## 3. 总结
使用ReentrantLock+Condition可以更安全的实现线程的同步、等待和唤醒。
* Condition可以替代wait/notify
* Condition对象必须从ReentrantLock对象获取
* ReentrantLock+Condition可以替代synchronized+wait/notify
最新文章
- svn web页面管理svnadmin部署
- EA使用
- CSS去除firefox点击链接时的虚线边框
- 想要愉快入住酒店?缺了它还真不行!(含PPT)
- 【转】“C语言说到底是一门以内存为中心的编程语言” —— 这种说法正确吗?
- bzoj 2440: [中山市选2011]完全平方数
- ios开发之触碰动画效果
- HTML5学习笔记简明版(1):HTML5介绍与语法
- iOS之GCD的DEMO
- 一个js变量以及其作用域的源码示例
- 使用wget下载JDK8
- Linux input子系统分析
- 关于Mac 系统mysql 乱码问题
- linux shell必知必会sed、awk
- 微服务框架Lagom介绍之一
- NET缓存框架CacheManager在混合式开发框架中的应用(1)-CacheManager的介绍和使用
- Python测试框架之Unittest梳理
- Asp.Net_ 服务端向客户端写JavaScript脚本
- ios时间差
- 精益软件研发的秘密 IT大咖说 - 大咖干货,不再错过