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

面试题
需求: 使用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. ClassLoader原理

    ClassLoader原理 JVM规范定义了两种类型的类装载器:启动内装载器 (bootstrap) 和用户自定义装载器 (user-defined class loader) . 一.    Cla ...

  2. Android APP开发入门教程-Button

    代码编写 做好准备工作后,终于可以开始写我们的hello android了,在开始编写代码之前,我们先了解几个文件: res/layout/main.xml App主窗体布局文件,你的应用长什么样都在 ...

  3. pat1081-1090

    1081 #include<cmath> #include<map> #include<iostream> #include<cstring> #inc ...

  4. freemark标签中输出boolean值

    private boolean showHeader=true; public boolean getShowHeader(){ return this.showHeader; } public bo ...

  5. Struts2的数据封装

    在很多的实际开发场景中,页面提交请求参数Action ,在Action中接收参数并对接收的数据进行封装.封装到一个JavaBean中,将JavaBean传递给业务层中.Struts2数据封装分为两类: ...

  6. 动态地添加HTML控件-JavaScript基础

    相关: document对象的createElement()方法可以创建一个新的HTML控件(document.createElement("input");) setAttrib ...

  7. [BZOJ4804]欧拉心算

    题面戳我 题意:求 \[\sum_{i=1}^{n}\sum_{j=1}^{n}\phi(\gcd(i,j))\] 多组数据,\(n\le10^7\). sol SBT 单组数据\(O(\sqrt n ...

  8. [SDOI2015]约数个数和

    Sol 首先有个结论 \(\sum_{i=1}^{m}\sum_{j=1}^{n}d(i*j)=\sum_{i=1}^{m}\sum_{j=1}^{n}\sum_{x|i}\sum_{y|i}[gcd ...

  9. Git知识总览(六) Git分支中的远程操作实践

    前几篇博客陆陆续续的讲了好多关于Git操作的内容,本篇博客仍然也不例外,不过本篇博客的主题是关于git的远程操作的.依照之前博客的风格,我们依然依托于LearningGitBranch中的相关内容来探 ...

  10. 28.Django cookie

    概述 1.获取cookie request.COOKIES['key'] request.COOKIES.get('key') request.get_signed_cookie(key, defau ...