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(1000);
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 = 0; i < 10; i++) {
try {
lock.lock();// 加锁
if (i == 5) {
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.signal();// 唤醒启动单个线程
System.out.println(Thread.currentThread().getName() + ":已经唤醒了一个线程!");
} catch (Exception e) {
System.out.println(Thread.currentThread().getName() + ":线程挂了!");
} finally {
lock.unlock();// 解锁
}
}
}
运行结果:2017-03-2501:16:17

java中的Condition协作线程接口类的更多相关文章
- 在java中,List是个接口,那实现List接口的类有哪些,有什么区别?
在java中,List是个接口,那实现List接口的类有哪些,有什么区别? 解答: ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引 ...
- Java中的进程与线程(总结篇)
详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...
- Java中的进程和线程
Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...
- JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用
Java 中无锁的线程安全整数 AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候, 不可避免的会用到synchron ...
- java中只能有一个实例的类的创建
Java中,如果我们创建一个类,想让这个类只有一个对象,那么我们可以 1:把该类的构造方法设计为private 2:在该类中定义一个static方法,在该方法中创建对象 package test; / ...
- java 中操作字符串都有哪些类?(未完成)它们之间有什么区别?(未完成)
java 中操作字符串都有哪些类?(未完成)它们之间有什么区别?(未完成)
- java中的++i是线程安全的吗?
java中的++i是线程安全的吗?为什么?怎么使它线程安全呢? 先说答案: 非线程安全 先说下为什么是非线程安全的? 从Java内存模型说起 Java内存模型规定了所有的便利都存储在主内存中,每个线程 ...
- Java中的I/O 线程 网络
Java学习总结--I/O,线程,网络题目整理 I/O 1.有什么理由必须要用字符流? 答:处理字符数据的语法更方便.自动化字符编码 2.插入哪些代码可以让下面的代码正确编译? Console con ...
- 浅谈Java中的Condition条件队列,手摸手带你实现一个阻塞队列!
条件队列是什么?可能很多人和我一样答不出来,不过今天终于搞清楚了! 什么是条件队列 条件队列:当某个线程调用了wait方法,或者通过Condition对象调用了await相关方法,线程就会进入阻塞状态 ...
随机推荐
- ActiveMQ(3)---ActiveMQ原理分析之消息持久化
持久化消息和非持久化消息的存储原理 正常情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的.能够存储的最大消息数据在${ActiveMQ_HOME}/conf/activemq.xml文 ...
- mySQL的表操作
1.新建表 CREATE TABLE 表名 ( 属性名 数据类型 [完整约束条件], 属性名 数据类型 [完整约束条件], ... ... 属性名 数据类型 [完整约束条件] ); 2.删除表 DRO ...
- sqlserver2008R2 全日志恢复 实例操作
--创建数据库create database test;--将数据库日志备份模式设置为全日志ALTER DATABASE test SET RECOVERY FULL ; --查询.确认数据库日志备份 ...
- The type initializer for System.Data.SqlClient.SqlConnection threw an exception
The type initializer for System.Data.SqlClient.SqlConnection threw an exception net framwork啥原因 xp电脑
- mysql监控执行的sql语句
转载 https://blog.csdn.net/nzjdsds/article/details/77513869 MySQL用SQL开启general_log并设置路径 2017年08月24日 00 ...
- python3列表(元组)练习
列表和元组一起练习l = [] 或者 li = list() 列表表示t = () 元组表示,元组不能修改,元组中只有两个方法 count().index(),同列表相同 li = [11,22,33 ...
- JSON Web Token(缩写 JWT) 目前最流行的跨域认证解决方案
一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和密码. 2.服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色.登录时间等等. ...
- 【译】图解Transformer
目录 从宏观上看Transformer 把张量画出来 开始编码! 从宏观上看自注意力 自注意力的细节 自注意力的矩阵计算 "多头"自注意力 用位置编码表示序列的顺序 残差 解码器 ...
- WEBLOGIC because another WebLogic Server instance is already using this directory
错误提示:because another WebLogic Server instance is already using this directory 原因:ldap目录数据库文件被锁定,可能是w ...
- Linux之ansible 常用模块
目的 代码发布系统 代码发布:把本地的代码通过某些方式弄到线上,可以供别人访问 部署 前戏 ansible 批量在远程主机上执行命令 puppet ruby ansible saltstack pyt ...