本文直接附上源代码,如下是自己写的一个例子

面试题
需求: 使用Condition来实现
三个线程
线程1
线程2
线程3
三个交替输出
【按照 线程1(main)-->线程2-->线程3】
如此往复50次 请写出程序

 public class ThreeConditionCommunication
{
/**
* 用于标记那个线程进行执行
* 1:主线程
* 2:线程2
* 3:线程3
*/
private static int HASOUT = 1;
public static void main(String[] args) throws InterruptedException
{
final Core core = new Core();
//子线程2
new Thread(
new Runnable()
{
@Override
public void run()
{
for (int i = 1; i <= 50; i++)
{
core.SubMethod2(i);
}
}
}
).start(); //子线程3
new Thread(
new Runnable()
{
@Override
public void run()
{
for (int i = 1; i <= 50; i++)
{
core.SubMethod3(i);
}
}
}
).start(); //主线程
for (int i = 1; i <= 50; i++)
{
core.MainMethod(i);
}
} /**
* 创建一个静态的类
* 将核心的业务逻辑的方法放在这里
* 体现了高内聚的特点
* @author huang.jf
*/
static class Core{
//创建一个Lock锁对象
public Lock lock = new ReentrantLock();
//创建三个Condition对象 分别用于控制三个线程
public Condition condition1 = lock.newCondition();
public Condition condition2 = lock.newCondition();
public Condition condition3 = lock.newCondition();
//线程2 循环输出10次
public void SubMethod2(int j){
lock.lock();//开启Lock锁
try{
//true 执行
//false 等待
while(HASOUT!=2){
try
{
condition2.await();//线程2等待
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
//线程2执行
for (int i = 1; i <= 10; i++)
{
System.out.println("this is sub2 thread..."+i+"......."+j);
}
HASOUT = 3;
condition3.signal();//唤醒线程3
}finally{
lock.unlock();//释放锁
}
} //线程3 循环输出20次
public void SubMethod3(int j){
lock.lock();//开启Lock锁
try{
//true 执行
//false 等待
while(HASOUT!=3){
try
{
condition3.await();//线程3等待
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
//线程3执行
for (int i = 1; i <= 20; i++)
{
System.out.println("this is sub3 thread..."+i+"......."+j);
}
HASOUT = 1;
condition1.signal();//唤醒线程1(主线程)
}finally{
lock.unlock();//释放锁
}
} //主线程调用循环输出一百次
public void MainMethod(int j){
lock.lock();
try{
//false 执行
//true 等待
while(HASOUT!=1){
try
{
condition1.await();//主线程等待
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
//执行主线程
for (int i = 1; i <= 100; i++)
{
System.out.println("this is main thread..."+i+"......"+j);
}
HASOUT = 2;
condition2.signal();//唤醒线程2
}finally{
lock.unlock();
}
}
}
}

输出结果可以自己尝试输出,指定到一个输出文件中,便于查看。

java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息的更多相关文章

  1. Java多线程系列--“JUC锁”06之 Condition条件

    概要 前面对JUC包中的锁的原理进行了介绍,本章会JUC中对与锁经常配合使用的Condition进行介绍,内容包括:Condition介绍Condition函数列表Condition示例转载请注明出处 ...

  2. java多线程编程核心技术(三)--线程间通信

    1.等待/通知机制 1.wait()方法:使当前执行代码的线程进行等待.wait()方法是Object类的方法,该方法将当前线程放入“预执行队列”中,并在wait()所处的代码行处停止执行.只到被唤起 ...

  3. Java多线程编程(三)线程间通信

    线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...

  4. 《java多线程编程核心技术》不使用等待通知机制 实现线程间通信的 疑问分析

    不使用等待通知机制 实现线程间通信的 疑问分析 2018年04月03日 17:15:08       ayf 阅读数:33 编辑 <java多线程编程核心技术>一书第三章开头,有如下案例: ...

  5. java并发编程(十)使用wait/notify/notifyAll实现线程间通信

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17225469 wait()方法:public final void wait()  thr ...

  6. Java线程之间通信

    用多线程的目的:更好的利用CPU的资源.因为所有的多线程代码都可以用单线程来实现. 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程. 并行:多个CPU实例或者多台机器同时执行一段处理逻辑, ...

  7. java 线程之间通信以及notify与notifyAll区别。

    jvm多个线程间的通信是通过 线程的锁.条件语句.以及wait().notify()/notifyAll组成. 下面来实现一个启用多个线程来循环的输出两个不同的语句. package com.app. ...

  8. Java学习笔记46(多线程三:线程之间的通信)

    多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个 ...

  9. MySQL中的连接、实例、会话、数据库、线程之间的关系

    MySQL中的实例.数据库关系简介 1.MySQL是单进程多线程(而Oracle等是多进程),也就是说MySQL实例在系 统上表现就是一个服务进程,即进程(通过多种方法可以创建多实例,再安装一个端口号 ...

随机推荐

  1. MySQL查询所有数据库表出错

    1.错误描述 1 queries executed, 0 success, 1 errors, 0 warnings 查询:show tables 错误代码: 1046 No database sel ...

  2. 配置Tomcat线程参数maxThreads、acceptCount

    一.配置Tomcat/conf/server.xml修改配置 <Connector port="8080" protocol="org.apache.coyote. ...

  3. 【BZOJ2875】随机数生成器(矩阵快速幂)

    [BZOJ2875]随机数生成器(矩阵快速幂) 题面 Description 栋栋最近迷上了随机算法,而随机数是生成随机算法的基础.栋栋准备使用线性同余法(Linear Congruential Me ...

  4. MySQL性能调优与架构设计

    1.Scale(扩展):从数据库来看,就是让数据库能够提供更强的服务能力 ScaleOut: 是通过增加处理节点的方式来提高整体处理能力 ScaleUp: 是通过增加当前处理节点的处理能力来提高整体的 ...

  5. PHP/JAVA 杂谈 一(php 槽点)

    [本文为个人意见,不喜就喷吧!] 最近,同事问到我,『那时候为什么从PHP转成Java?』,我想了很久,且撇开主观上的原因,当初业务重构使用java确实有很多可以说道的地方. 槽点1:哪有最好的语言, ...

  6. [转]Thunderbird 使用 Exchange 邮箱

    [转]Thunderbird 使用 Exchange 邮箱 http://my.oschina.net/MaTech/blog/295238#OSC_h3_1 公司最近邮箱只支持Exchange模式, ...

  7. 实用的Docker入门

    1 Docker概述 Docker和虚拟机一样,都拥有环境隔离的能力,但它比虚拟机更加轻量级,可以使资源更大化地得到应用.首先来看Docker的架构图: 理解其中几个概念: Client(Docker ...

  8. 如何在WordPress文本小工具中使用PHP

    只需添加以下代码片段到你当前主题的functions.php文件 add_filter('widget_text', 'php_text', 99); function php_text($text) ...

  9. wim命令删除后重新安装

    个人原创博客,转载请注明,否则追究法律责任 2017-09-30-09:51:20 1,删除vim命令.模拟错误 [root@localhost ~]# which vim/usr/bin/vim[r ...

  10. 引用第三方dll引发的问题解决

    引用的程序集错误  如果引用第三方dll,调试出现引用的程序集出现错误,可以下载dependency,查看这个dll的依赖dll,如果本地电脑没有依赖dll或依赖dll出现问题,则下载或取代依赖dll ...