码上敲享录 > java高并发常见问题 > ReentrantLock、Condition结合使用实现多线程通讯

ReentrantLock、Condition结合使用实现多线程通讯

上一章章节目录下一章 2018-08-03已有1588人阅读 评论(0)

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
0

有建议,请留言!

  • *您的姓名:

  • *所在城市:

  • *您的联系电话:

    *您的QQ:

  • 咨询问题:

  • 提 交