java中使用ReentrantLock锁中的Condition实现三个线程之间通信,交替输出信息
本文直接附上源代码,如下是自己写的一个例子
面试题
需求: 使用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实现三个线程之间通信,交替输出信息的更多相关文章
- Java多线程系列--“JUC锁”06之 Condition条件
概要 前面对JUC包中的锁的原理进行了介绍,本章会JUC中对与锁经常配合使用的Condition进行介绍,内容包括:Condition介绍Condition函数列表Condition示例转载请注明出处 ...
- java多线程编程核心技术(三)--线程间通信
1.等待/通知机制 1.wait()方法:使当前执行代码的线程进行等待.wait()方法是Object类的方法,该方法将当前线程放入“预执行队列”中,并在wait()所处的代码行处停止执行.只到被唤起 ...
- Java多线程编程(三)线程间通信
线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一,可以说,使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时 ...
- 《java多线程编程核心技术》不使用等待通知机制 实现线程间通信的 疑问分析
不使用等待通知机制 实现线程间通信的 疑问分析 2018年04月03日 17:15:08 ayf 阅读数:33 编辑 <java多线程编程核心技术>一书第三章开头,有如下案例: ...
- java并发编程(十)使用wait/notify/notifyAll实现线程间通信
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17225469 wait()方法:public final void wait() thr ...
- Java线程之间通信
用多线程的目的:更好的利用CPU的资源.因为所有的多线程代码都可以用单线程来实现. 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程. 并行:多个CPU实例或者多台机器同时执行一段处理逻辑, ...
- java 线程之间通信以及notify与notifyAll区别。
jvm多个线程间的通信是通过 线程的锁.条件语句.以及wait().notify()/notifyAll组成. 下面来实现一个启用多个线程来循环的输出两个不同的语句. package com.app. ...
- Java学习笔记46(多线程三:线程之间的通信)
多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个 ...
- MySQL中的连接、实例、会话、数据库、线程之间的关系
MySQL中的实例.数据库关系简介 1.MySQL是单进程多线程(而Oracle等是多进程),也就是说MySQL实例在系 统上表现就是一个服务进程,即进程(通过多种方法可以创建多实例,再安装一个端口号 ...
随机推荐
- 芝麻HTTP: Python爬虫利器之Requests库的用法
前言 之前我们用了 urllib 库,这个作为入门的工具还是不错的,对了解一些爬虫的基本理念,掌握爬虫爬取的流程有所帮助.入门之后,我们就需要学习一些更加高级的内容和工具来方便我们的爬取.那么这一节来 ...
- Tomcat 代码方式启动
配置好参数,只需在Booter类中调用 EmbbedTomcat.main(args); 就可以启动. maven中也需要配置相应插件. import java.io.File; import org ...
- SqlBulkCopy 批量复制数据到数据库
1.简介 1.MSDN 核心方法:SqlBulkCopy.WriteToServer 将所有行从数据源复制到 SqlBulkCopy 对象的 DestinationTableName 属性指定的目标表 ...
- 基于puppet分布式集群管理公有云多租户的架构浅谈
基于puppet分布式集群管理公有云多租户的架构浅谈 一.架构介绍 在此架构中,每个租户的业务集群部署一台puppet-master作为自己所在业务集群的puppet的主服务器,在每个业务集群所拥 ...
- Luogu Dynamic Ranking (带修改的主席树)
题目大意: 网址:https://www.luogu.org/problemnew/show/2617 给定一个序列a[1].a[2].....a[N],完成M个操作,操作有两种: [1]Q i j ...
- [BZOJ1024] [SCOI2009] 生日快乐 (搜索)
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋 ...
- linux下tomcat 8的安装以及tomcat启动慢问题
今天在 linux 下安装了 tomcat,中间也是一路波折,最终安装好了.感觉应该有不少伙伴跟我一样都会踩到这些坑,打算记录下来.使用的是通用(ubantu,debian, centos 均可)的安 ...
- 【noip模拟】修长城
Time Limit: 1000ms Memory Limit: 256MB Description 大家都知道,长城在自然条件下会被侵蚀,因此,我们需要修复.现在是21世纪,修复长城的事情当然 ...
- Linux中“is not in the sudoers file”解决方法
当在终端执行sudo命令时,系统提示"hadoop is not in the sudoers file": 其实就是没有权限进行sudo,解决方法如下(这里假设用户名是cuser ...
- JDBC存在的问题
1.数据库连接频繁的创建和关闭,缺点是浪费数据库资源,影响操作效率. 设想:使用数据库连接池 2.sql语句是硬编码,如果需求变更需要修改sql,就需要修改java代码,需要重新编译,系统不易维护. ...