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

面试题
需求: 使用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. 芝麻HTTP: Python爬虫利器之Requests库的用法

    前言 之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来 ...

  2. Tomcat 代码方式启动

    配置好参数,只需在Booter类中调用 EmbbedTomcat.main(args); 就可以启动. maven中也需要配置相应插件. import java.io.File; import org ...

  3. SqlBulkCopy 批量复制数据到数据库

    1.简介 1.MSDN 核心方法:SqlBulkCopy.WriteToServer 将所有行从数据源复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表 ...

  4. 基于puppet分布式集群管理公有云多租户的架构浅谈

    基于puppet分布式集群管理公有云多租户的架构浅谈 一.架构介绍   在此架构中,每个租户的业务集群部署一台puppet-master作为自己所在业务集群的puppet的主服务器,在每个业务集群所拥 ...

  5. Luogu Dynamic Ranking (带修改的主席树)

    题目大意: 网址:https://www.luogu.org/problemnew/show/2617 给定一个序列a[1].a[2].....a[N],完成M个操作,操作有两种: [1]Q i j ...

  6. [BZOJ1024] [SCOI2009] 生日快乐 (搜索)

    Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋 ...

  7. linux下tomcat 8的安装以及tomcat启动慢问题

    今天在 linux 下安装了 tomcat,中间也是一路波折,最终安装好了.感觉应该有不少伙伴跟我一样都会踩到这些坑,打算记录下来.使用的是通用(ubantu,debian, centos 均可)的安 ...

  8. 【noip模拟】修长城

    Time Limit: 1000ms    Memory Limit: 256MB Description 大家都知道,长城在自然条件下会被侵蚀,因此,我们需要修复.现在是21世纪,修复长城的事情当然 ...

  9. Linux中“is not in the sudoers file”解决方法

    当在终端执行sudo命令时,系统提示"hadoop is not in the sudoers file": 其实就是没有权限进行sudo,解决方法如下(这里假设用户名是cuser ...

  10. JDBC存在的问题

    1.数据库连接频繁的创建和关闭,缺点是浪费数据库资源,影响操作效率. 设想:使用数据库连接池 2.sql语句是硬编码,如果需求变更需要修改sql,就需要修改java代码,需要重新编译,系统不易维护. ...