condition实现通知部分线程
多个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实现通知部分线程相关推荐
- 关于Java线程通讯的学习日志
Java中线程通讯 主要涉及对并发线程的操控 1.利用synchronized进行对象锁定实现对线程的控制 2.使用lock condition进行线程控制 3.使用管道(Piped)Stream 为 ...
- java线程通信总结
一.线程之间如何工作 大家都知道计算机的核心是CPU,它承担着计算机所搜的计算任务, 而操作系统负责计算机任务的调度,资源管理与分配. 进程是一个具有独立功能的程序,是操作系统进行资源分配和调 ...
- JVM、JUC、网络、线程
1. JVM 面试常见: 请你谈谈你对 JVM 的理解? java 8 虚拟机和之前的变化更新? 什么是 OOM,什么是栈溢出 StackOverFlowError? 怎么分析? JVM的常用调优参数 ...
- java 线程 hold_java-多线程
学习笔记,持续更新!!! 2019.04.30 1.进程和线程的概念 进程:进程是操作系统结构的基础,是一次程序的执行:是一个程序及其数据在处理机上顺序执行时所发生的活动:是程序在一个数据集合上运行的 ...
- JAVA线程通信详解
目录 一.概述 二.wait/notify 机制 三.Condition 四.生产者/消费者模式 五.线程间的通信--管道 六.方法Join的使用 一.概述 线程与线程之间不是相互独立的个体,它们彼此 ...
- java多线程基础视频_【No996】2020年最新 Java多线程编程核心基础视频课程
01.课程介绍.mp4 02.多线程编程基础-进程与线程.mp4 03.多线程编程基础-使用多线程-继承Thread类.mp4 04.多线程编程基础-使用多线程-实现Runnable接口.mp4 05 ...
- Java 并发编程 基础
第一章 线程的操作 1.1创建多线程的方式 第一种:继承Thread 第二种:实现Runnable接口 1.2线程的常用方法 currentThread(): 获取当前线程 isAlive():判断当 ...
- 多线程编程核心技术总结(读周志明书籍的总结)
多线程编程核心技术总结 1.Java多线程基本技能 1.1进程和线程的概念: 进程是独立的程序,线程是在进程中独立运行的子任务. 1.2使用多线程 1.2.1实现方法:继承Thread类,重写Runn ...
- java并发编程的艺术-(4)
四.Lock的使用 Lock对象比synchronized 的使用更加灵活,并且支持嗅探锁定,多路分支通知 1. ReentrantLock 实现同步 lock对象的 lock()方法,必须在 fin ...
最新文章
- java 原子量_Java原子量 - Rickxue的个人空间 - OSCHINA - 中文开源技术交流社区
- c++ ofstream使用方法
- Direct3D初始化代码含义
- Mysql data type
- 非阻塞,send后马上close消息能成功发出去吗
- myeclipse如何修改Web项目名称
- 学生宿舍管理系统——UML 2nd
- 微信换头像小程序实现原理及源码
- 科技爱好者周刊:第 83 期
- Node.js 种子下载器
- 白话Elasticsearch59-数据建模实战_ Nested Aggregation/ Reverse nested Aggregation对嵌套的博客评论数据进行聚合分析
- 1万小时缔造的世界第一程序员
- 通用流量办什么卡划算?告诉你三大运营商该如何选择?
- 如何短时间突击 Java面试?附刷题神器
- MATLAB-视频的前景目标提取
- 去掉JW Player水印及右键官方菜单
- 老熊的三分地-Oracle、UNIX、数据恢复
- 20154312 曾林 EXP6 信息搜集与漏洞扫描
- 日志服务与日志分析工具
- 普通文艺二逼的iPhone音乐应用推荐
热门文章
- python安装多久_(一)安装Python
- python找第二大的数索引_python – 在numpy数组中查找多个值的行索引
- 阿里云物联网平台python开发手册_阿里云物联网平台之云端API调用(即云端开发教程)...
- php冒泡排序的用途,浅谈php冒泡排序
- dofilter在java中_在Filter的doFilter中进行重定向 出现异常
- 漫步者蓝牙只有一边有声音_2019年上半年最具“诚意”的真无线劲挂蓝牙耳机新品...
- [Android5 系列二] 1. 全实例之控件(Widget)
- PSP(Python Server Pages) 快速实例
- Linux下VNCSERVER的使用介绍
- 【无标题】自己动手写Docker系列 -- 6.3 手动配置容器网络(上)