在Java的Condition接口【唤醒全部线程】
在Java的Condition接口中,存在的几个方法跟Synchronized中的wait(),waitall(),wait(time ^),这个几个方法一一对应起来,但是在Lock.newCondition()返回中可以指定指定的线程释放和等待资源。
请看【唤醒全部线程】实例:
- package TestThread.TestCondition;
- import java.util.concurrent.locks.ReentrantLock;
- import java.util.concurrent.locks.*;
- public class TestCondition {
- public static void main(String[] args) {
- ReentrantLock lock = new ReentrantLock();
- Condition condition = lock.newCondition();
- Test1 th1 = new Test1(lock, condition, "线程1");
- Test1 th2 = new Test1(lock, condition, "线程2");
- Test1 th3 = new Test1(lock, condition, "线程3");
- Test2 t2 = new Test2(condition, lock, "我是唤醒线程");
- th1.start();
- th2.start();
- th3.start();
- try {
- Thread.sleep();
- t2.start();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- class Test1 extends Thread {
- private ReentrantLock lock;
- private Condition condition1;
- public Test1(ReentrantLock lock, Condition condition1, String name) {
- super(name);
- this.lock = lock;
- this.condition1 = condition1;
- }
- @Override
- public void run() {
- for (int i = ; i < ; i++) {
- try {
- lock.lock();// 加锁
- if (i == ) {
- try {
- condition1.await();
- System.out.println(Thread.currentThread().getName() + "当前线程获取到的值为:++++++++++++" + i);
- } catch (InterruptedException e) {
- System.out.println(Thread.currentThread().getName() + ":线程被中断了!");
- }
- } else {
- System.out.println(Thread.currentThread().getName() + ":当前线程获取到的值为===》" + i);
- }
- } catch (Exception e) {
- System.out.println("系统发生异常!");
- } finally {
- lock.unlock();// 解锁
- }
- }
- }
- }
- class Test2 extends Thread {
- private Condition condition;
- public ReentrantLock lock;
- /**
- * @param condition协作对象
- * @param lock锁对象
- * @param name线程名称
- */
- public Test2(Condition condition, ReentrantLock lock, String name) {
- super(name);
- this.condition = condition;
- this.lock = lock;
- }
- @Override
- public void run() {
- try {
- lock.lock();// 加锁
- condition.signalAll();;// 唤醒启动全部线程
- System.out.println(Thread.currentThread().getName() + ":已经唤醒了一个线程!");
- } catch (Exception e) {
- System.out.println(Thread.currentThread().getName() + ":线程挂了!");
- } finally {
- lock.unlock();// 解锁
- }
- }
- }
- 测试结果:
在Java的Condition接口【唤醒全部线程】的更多相关文章
- Java并发Condition接口
java.util.concurrent.locks.Condition接口提供一个线程挂起执行的能力,直到给定的条件为真. Condition对象必须绑定到Lock,并使用newCondition( ...
- Java的LockSupport工具,Condition接口和ConditionObject
在之前我们文章(关于多线程编程基础和同步器),我们就接触到了LockSupport工具和Condition接口,之前使用LockSupport工具来唤醒阻塞的线程,使用Condition接口来实现线程 ...
- 并发之lock的condition接口
13.死磕Java并发-----J.U.C之Condition 12.Condition使用总结 11.Java并发编程系列之十七:Condition接口 === 13.死磕Java并发-----J. ...
- Java之多线程开发时多条件Condition接口的使用
转:http://blog.csdn.net/a352193394/article/details/39454157 我们在多线程开发中,可能会出现这种情况.就是一个线程需要另外一个线程满足某某条件才 ...
- Java并发编程(十三)线程间协作的两种方式:wait、notify、notifyAll和Condition
在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权.因为生产者如果 ...
- java多线程 -- Condition 控制线程通信
Api文档如此定义: Condition 将 Object 监视器方法(wait.notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对 ...
- Java 并发编程之 Condition 接口
本文部分摘自<Java 并发编程的艺术> 概述 任意一个 Java 对象,都拥有一个监视器方法,主要包括 wait().wait(long timeout).notify() 以及 not ...
- (三)juc高级特性——虚假唤醒 / Condition / 按序交替 / ReadWriteLock / 线程八锁
8. 生产者消费者案例-虚假唤醒 参考下面生产者消费者案例: /* * 生产者和消费者案例 */ public class TestProductorAndConsumer { public stat ...
- java中的锁之Lock接口与Condition接口
一.Lock源码. 1.是一个接口.一共有6个方法. 2.方法详细如下: (1)当前线程尝试获取锁.结果分两种情况,一是成功获取到锁,则返回:二是获取锁失败,则一直等待.不响应中断请求. (2)当前线 ...
随机推荐
- 快乐!ajax入门(1)
今天试着默写ajax时出现了神秘的问题,出现如图所示的错误: 百度了一下,说是跨源问题,我以为放在同一个文件夹不也是同源嘛!结果打扰了,属实是弟弟,协议,域名,端口相同的算同源,其他的不是!!! 最后 ...
- sqlserver2008R2 全日志恢复 实例操作
--创建数据库create database test;--将数据库日志备份模式设置为全日志ALTER DATABASE test SET RECOVERY FULL ; --查询.确认数据库日志备份 ...
- 属性控件CMFCPropertyGridCtrl简单用法
这是我的原创! 用一堆的编辑框下拉框做配置界面,很是繁琐,还要对齐排版……用这个属性控件 CMFCPropertyGridCtrl 就可以统一风格了. //初始化 CMFCPropertyGridCt ...
- TinkPHP框架学习-02控制器基本操作
1-----创建控制器 2-----访问视图页面 3-----注册变量到视图页面 4-----获取表单数据 一 在Home模块下创建控制器 举例: 目录tp/Application/H ...
- 超详细的遗传算法(Genetic Algorithm)解析
https://blog.csdn.net/u010451580/article/details/51178225 https://www.jianshu.com/p/c82f09adee8f 00 ...
- 讨论下茴香逗的茴字有几种写法,javascript字符串数组查找“indexOf"的替代方式。
- [ts] Property 'aaa' does not exist on type 'Window' 解决办法
第一种: (window as any).aaa 第二种: declare global { interface Window { aaa: any; } } window.aaa = window. ...
- 《转》完美解决微信video视频隐藏控件和内联播放问题
地址:https://blog.csdn.net/xiao190128/article/details/81025378 var u = navigator.userAgent; var isAndr ...
- std::remove_reference
[std::remove_reference] 用于移除类型的引用,返回原始类型. 1.可能的实现. 2.例子. #include <iostream> // std::cout #inc ...
- 大数据入门到精通18--sqoop 导入关系库到hdfs中和hive表中
一,选择数据库,这里使用标准mysql sakila数据库 mysql -u root -D sakila -p 二.首先尝试把表中的数据导入到hdfs文件中,这样后续就可以使用spark来dataf ...