ReentrantLock、Condition结合使用实现多线程通讯
解决方法:
完整代码如下,新建一个SemaphoreTest类,复制以下代码,运行main方法即可出现多线程通讯效果。
场景:创建一个无界线程池,启动两个线程,第一个线程进去等待状态,第二个线程唤醒所有线程继续执行。
结果:
pool-1-thread-1进入了等待
pool-1-thread-2唤醒了所有的线程
pool-1-thread-1被唤醒
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class SemaphoreTest {
static volatile private ReentrantLock lock = new ReentrantLock();
static volatile private Condition condition =lock.newCondition();
static volatile private Boolean isWait=false;
private static void test() throws InterruptedException {
lock.lock();//只有一个线程可以执行下面的代码
if(!isWait){
System.out.println(Thread.currentThread().getName()+"进入了等待");
isWait=true;
condition.await();
System.out.println(Thread.currentThread().getName()+"被唤醒");
}else{
isWait=false;
condition.signalAll();
System.out.println(Thread.currentThread().getName()+"唤醒了所有的线程");
}
lock.unlock();
}
public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
for(int i=0;i<2;i++){//开启两个线程
executorService.execute(new Runnable() {
@Override
public void run() {
try {
test();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}
}
本文链接:http://www.yayihouse.com/yayishuwu/chapter/1405
向大家推荐《Activiti工作流实战教程》:https://xiaozhuanlan.com/activiti