多个condition实现通知部分线程:

 1 import java.util.concurrent.locks.Condition;
 2 import java.util.concurrent.locks.Lock;
 3 import java.util.concurrent.locks.ReentrantLock;
 4
 5 public class MyService {
 6     private Lock lock = new ReentrantLock();
 7     //获取两个Condition
 8     private Condition conditionA = lock.newCondition();
 9     private Condition conditionB = lock.newCondition();
10
11     public void awaitA() {
12         try {
13             lock.lock();
14             System.out.println("begin awaitA时间:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
15             conditionA.await();
16             System.out.println("end awaitA时间:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
17         } catch (InterruptedException e) {
18             e.printStackTrace();
19         }finally {
20             lock.unlock();
21         }
22     }
23
24     public void awaitB() {
25         try {
26             lock.lock();
27             System.out.println("begin awaitB时间:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
28             conditionB.await();
29             System.out.println("end awaitB时间:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
30         } catch (InterruptedException e) {
31             e.printStackTrace();
32         }finally {
33             lock.unlock();
34         }
35     }
36
37     public void signalAll_A() {
38         try {
39             lock.lock();
40             System.out.println("signalAll_A时间为:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
41             conditionA.signalAll();
42         } catch (Exception e) {
43             e.printStackTrace();
44         }finally {
45             lock.unlock();
46         }
47     }
48
49     public void signalAll_B() {
50         try {
51             lock.lock();
52             System.out.println("signalAll_B时间为:" + System.currentTimeMillis() + "----" + Thread.currentThread().getName());
53             conditionB.signalAll();
54         } catch (Exception e) {
55             e.printStackTrace();
56         }finally {
57             lock.unlock();
58         }
59     }
60 }

 1 public class ThreadA extends Thread{
 2
 3     private MyService service;
 4
 5     public ThreadA(MyService service) {
 6         this.service = service;
 7     }
 8
 9     @Override
10     public void run() {
11         service.awaitA();
12     }
13 }

 1 public class ThreadB extends Thread{
 2
 3     private MyService service;
 4
 5     public ThreadB(MyService service) {
 6         this.service = service;
 7     }
 8
 9     @Override
10     public void run() {
11         service.awaitB();
12     }
13 }

 1 /**
 2  *    测试类
 3  */
 4 public class Run {
 5
 6     public static void main(String[] args) {
 7         MyService service = new MyService();
 8         ThreadA a = new ThreadA(service);
 9         a.setName("A");
10         a.start();
11
12         ThreadB b = new ThreadB(service);
13         b.setName("B");
14         b.start();
15         try {
16             Thread.sleep(3000);
17         } catch (InterruptedException e) {
18             e.printStackTrace();
19         }
20         //只唤醒A
21         service.signalAll_A();
22     }
23 }

运行结果如下:

  

转载于:https://www.cnblogs.com/wang1001/p/9566741.html

condition实现通知部分线程相关推荐

  1. 关于Java线程通讯的学习日志

    Java中线程通讯 主要涉及对并发线程的操控 1.利用synchronized进行对象锁定实现对线程的控制 2.使用lock condition进行线程控制 3.使用管道(Piped)Stream 为 ...

  2. java线程通信总结

    一.线程之间如何工作   大家都知道计算机的核心是CPU,它承担着计算机所搜的计算任务, 而操作系统负责计算机任务的调度,资源管理与分配.   进程是一个具有独立功能的程序,是操作系统进行资源分配和调 ...

  3. JVM、JUC、网络、线程

    1. JVM 面试常见: 请你谈谈你对 JVM 的理解? java 8 虚拟机和之前的变化更新? 什么是 OOM,什么是栈溢出 StackOverFlowError? 怎么分析? JVM的常用调优参数 ...

  4. java 线程 hold_java-多线程

    学习笔记,持续更新!!! 2019.04.30 1.进程和线程的概念 进程:进程是操作系统结构的基础,是一次程序的执行:是一个程序及其数据在处理机上顺序执行时所发生的活动:是程序在一个数据集合上运行的 ...

  5. JAVA线程通信详解

    目录 一.概述 二.wait/notify 机制 三.Condition 四.生产者/消费者模式 五.线程间的通信--管道 六.方法Join的使用 一.概述 线程与线程之间不是相互独立的个体,它们彼此 ...

  6. java多线程基础视频_【No996】2020年最新 Java多线程编程核心基础视频课程

    01.课程介绍.mp4 02.多线程编程基础-进程与线程.mp4 03.多线程编程基础-使用多线程-继承Thread类.mp4 04.多线程编程基础-使用多线程-实现Runnable接口.mp4 05 ...

  7. Java 并发编程 基础

    第一章 线程的操作 1.1创建多线程的方式 第一种:继承Thread 第二种:实现Runnable接口 1.2线程的常用方法 currentThread(): 获取当前线程 isAlive():判断当 ...

  8. 多线程编程核心技术总结(读周志明书籍的总结)

    多线程编程核心技术总结 1.Java多线程基本技能 1.1进程和线程的概念: 进程是独立的程序,线程是在进程中独立运行的子任务. 1.2使用多线程 1.2.1实现方法:继承Thread类,重写Runn ...

  9. java并发编程的艺术-(4)

    四.Lock的使用 Lock对象比synchronized 的使用更加灵活,并且支持嗅探锁定,多路分支通知 1. ReentrantLock 实现同步 lock对象的 lock()方法,必须在 fin ...

最新文章

  1. java 原子量_Java原子量 - Rickxue的个人空间 - OSCHINA - 中文开源技术交流社区
  2. c++ ofstream使用方法
  3. Direct3D初始化代码含义
  4. Mysql data type
  5. 非阻塞,send后马上close消息能成功发出去吗
  6. myeclipse如何修改Web项目名称
  7. 学生宿舍管理系统——UML 2nd
  8. 微信换头像小程序实现原理及源码
  9. 科技爱好者周刊:第 83 期
  10. Node.js 种子下载器
  11. 白话Elasticsearch59-数据建模实战_ Nested Aggregation/ Reverse nested Aggregation对嵌套的博客评论数据进行聚合分析
  12. 1万小时缔造的世界第一程序员
  13. 通用流量办什么卡划算?告诉你三大运营商该如何选择?
  14. 如何短时间突击 Java面试?附刷题神器
  15. MATLAB-视频的前景目标提取
  16. 去掉JW Player水印及右键官方菜单
  17. 老熊的三分地-Oracle、UNIX、数据恢复
  18. 20154312 曾林 EXP6 信息搜集与漏洞扫描
  19. 日志服务与日志分析工具
  20. 普通文艺二逼的iPhone音乐应用推荐

热门文章

  1. python安装多久_(一)安装Python
  2. python找第二大的数索引_python – 在numpy数组中查找多个值的行索引
  3. 阿里云物联网平台python开发手册_阿里云物联网平台之云端API调用(即云端开发教程)...
  4. php冒泡排序的用途,浅谈php冒泡排序
  5. dofilter在java中_在Filter的doFilter中进行重定向 出现异常
  6. 漫步者蓝牙只有一边有声音_2019年上半年最具“诚意”的真无线劲挂蓝牙耳机新品...
  7. [Android5 系列二] 1. 全实例之控件(Widget)
  8. PSP(Python Server Pages) 快速实例
  9. Linux下VNCSERVER的使用介绍
  10. 【无标题】自己动手写Docker系列 -- 6.3 手动配置容器网络(上)