在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协作线程接口类的更多相关文章

  1. 在java中,List是个接口,那实现List接口的类有哪些,有什么区别?

    在java中,List是个接口,那实现List接口的类有哪些,有什么区别? 解答: ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引 ...

  2. Java中的进程与线程(总结篇)

    详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...

  3. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  4. JAVA 中无锁的线程安全整数 AtomicInteger介绍和使用

    Java 中无锁的线程安全整数 AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候, 不可避免的会用到synchron ...

  5. java中只能有一个实例的类的创建

    Java中,如果我们创建一个类,想让这个类只有一个对象,那么我们可以 1:把该类的构造方法设计为private 2:在该类中定义一个static方法,在该方法中创建对象 package test; / ...

  6. java 中操作字符串都有哪些类?(未完成)它们之间有什么区别?(未完成)

    java 中操作字符串都有哪些类?(未完成)它们之间有什么区别?(未完成)

  7. java中的++i是线程安全的吗?

    java中的++i是线程安全的吗?为什么?怎么使它线程安全呢? 先说答案: 非线程安全 先说下为什么是非线程安全的? 从Java内存模型说起 Java内存模型规定了所有的便利都存储在主内存中,每个线程 ...

  8. Java中的I/O 线程 网络

    Java学习总结--I/O,线程,网络题目整理 I/O 1.有什么理由必须要用字符流? 答:处理字符数据的语法更方便.自动化字符编码 2.插入哪些代码可以让下面的代码正确编译? Console con ...

  9. 浅谈Java中的Condition条件队列,手摸手带你实现一个阻塞队列!

    条件队列是什么?可能很多人和我一样答不出来,不过今天终于搞清楚了! 什么是条件队列 条件队列:当某个线程调用了wait方法,或者通过Condition对象调用了await相关方法,线程就会进入阻塞状态 ...

随机推荐

  1. MVC人员管理系统

    基本都要使用C控制器中的两个action来完成操作,一个用于从主界面跳转到新页面.同时将所需操作的数据传到新界面,另一个则对应新界面的按钮,用于完成操作.将数据传回主界面以及跳转回主界面.根据不同情况 ...

  2. java面试题复习(八)

    71.如何通过反射创建对象? 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()  方法2:通过类对象的getConstructor()或 ...

  3. java高并发实战(一)——为什么需要并发

    转自:https://blog.csdn.net/gududedabai/article/details/80813592

  4. sql 日志文件截断收缩

    use mydb ALTER DATABASE mydb SET RECOVERY SIMPLE WITH NO_WAIT ALTER DATABASE mydb SET RECOVERY SIMPL ...

  5. 2.数据库的基本操作<针对于库层面的操作>

    1.查看已有数据库: MySQL [(none)]> show databases; +--------------------+ | Database | +----------------- ...

  6. linux上如何设置网络,出现connect: network is unreachable 的问题。

    发现有网友问有关ping命令出现connect: network is unreachable 的问题. 这通常是因为没正确设置ip地址. 解决方法: 在确保完善网卡驱动,以及确保将网卡驱动编译进内核 ...

  7. xLearn

    https://blog.csdn.net/songbinxu/article/details/79662665

  8. Java框架spring 学习笔记(一):SpringBean、ApplicationContext 容器、BeanFactory容器

    Spring容器是Spring框架的核心,容器可以创建对象并创建的对象连接在一起,配置和管理他们的整个生命周期.Spring 容器使用依赖注入(DI)来作为管理应用程序的组件,被称为 Spring B ...

  9. Django2 SQLite3迁移到MySQL数据库

    https://blog.csdn.net/weixin_34257076/article/details/86843658

  10. 牛客练习赛44C

    链接:https://ac.nowcoder.com/acm/contest/634/C来源:牛客网 题目描述 给出一个区间[L,R],求出[L,R]中孪生质数有多少对. 由于这是一个区间筛质数的模板 ...