接上一篇,实现Condition三个条件,有这样一个应用:

1、 有三个进程,第一个进程执行1次,第二个进程执行2次,第三个进程执行3次;

2、 先执行第二个进程,然后第一个,然后第三个;

3、  依次执行5次循环。

分析:

此时若用Object的wait和notify是实现不了的,我们可以用Lock锁的Condition实现,我们需要定义三个信号条件,分别控制这三个进程。

实现如下:

package andy.thread.test;import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** @author Zhang,Tianyou* @version 2014年11月9日 下午12:12:44*/public class ThreeThreadCondition {static A tasks = new A();public static void main(String[] args) {// 2号线程new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 5; i++) {// 循环执行5次tasks.sub2(i);}}}).start();// 3号线程new Thread(new Runnable() {@Overridepublic void run() {for (int i = 1; i <= 5; i++) {// 循环执行5次tasks.sub3(i);}}}).start();// 主线程代替1号线程for (int i = 1; i <= 5; i++) {// 循环执行5次tasks.sub1(i);}}static class A {Lock lock = new ReentrantLock();Condition condition1 = lock.newCondition();Condition condition2 = lock.newCondition();Condition condition3 = lock.newCondition();// 先执行2号线程private int execuNum = 2;public void sub2(int i) {lock.lock();try {// 若不是2 则阻塞等待while (execuNum != 2) {try {condition2.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}for (int j = 1; j <= 2; j++) {System.out.println("sub2 thread sequence of " + j+ ", task is " + i);}// 执行完 交给1线程execuNum = 1;condition1.signal();} finally {lock.unlock();}}public void sub1(int i) {lock.lock();try {// 若不是1则阻塞等待while (execuNum != 1) {try {condition1.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}System.out.println("sub1 thread sequence of " + 1+ ", task is " + i);// 执行完 交给3线程execuNum = 3;condition3.signal();} finally {lock.unlock();}}public void sub3(int i) {lock.lock();try {// 若不是2 则阻塞等待while (execuNum != 3) {try {condition3.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}for (int j = 1; j <= 3; j++) {System.out.println("sub3 thread sequence of " + j+ ", task is " + i);}// 执行完 交给1线程execuNum = 2;condition2.signal();} finally {lock.unlock();}}}}

运行结果如下:

sub2 thread sequence of 1, task is 1
sub2 thread sequence of 2, task is 1
sub1 thread sequence of 1, task is 1
sub3 thread sequence of 1, task is 1
sub3 thread sequence of 2, task is 1
sub3 thread sequence of 3, task is 1
sub2 thread sequence of 1, task is 2
sub2 thread sequence of 2, task is 2
sub1 thread sequence of 1, task is 2
sub3 thread sequence of 1, task is 2
sub3 thread sequence of 2, task is 2
sub3 thread sequence of 3, task is 2
sub2 thread sequence of 1, task is 3
sub2 thread sequence of 2, task is 3
sub1 thread sequence of 1, task is 3
sub3 thread sequence of 1, task is 3
sub3 thread sequence of 2, task is 3
sub3 thread sequence of 3, task is 3
sub2 thread sequence of 1, task is 4
sub2 thread sequence of 2, task is 4
sub1 thread sequence of 1, task is 4
sub3 thread sequence of 1, task is 4
sub3 thread sequence of 2, task is 4
sub3 thread sequence of 3, task is 4
sub2 thread sequence of 1, task is 5
sub2 thread sequence of 2, task is 5
sub1 thread sequence of 1, task is 5
sub3 thread sequence of 1, task is 5
sub3 thread sequence of 2, task is 5
sub3 thread sequence of 3, task is 5

多线程之线程通信条件Condition二相关推荐

  1. Java多线程之线程通信之生产者消费者阻塞队列版

    Java多线程之线程通信之生产者消费者传统版和阻塞队列版 目录 线程通信之生产者消费者传统版 线程通信之生产者消费者阻塞队列版 1. 线程通信之生产者消费者传统版 题目: 一个初始值为零的变量,两个线 ...

  2. java 管程通信_Java多线程07_线程通信之管程法与信号灯法

    Java多线程07_线程通信之管程法与信号灯法 线程通信 的应用场景是 消费者/生产者问题: 解决线程通信的方法: wait()表示线程一直等待,直到接到通知(会释放锁) wait(long time ...

  3. 多线程 4——线程通信、线程池、定时器

    多线程 一.线程通信 1.等待集 2.wait()方法 3.notify() / notifyAll()方法 4.等待队列/同步队列 5.生产者消费者模型 二.线程池 1.jdk中的线程池 2.自己实 ...

  4. 多线程(三)线程通信

    线程中断.线程让步.线程睡眠.线程合并的使用推荐翻阅这篇博客:http://blog.csdn.net/ghsau/article/details/17560467 本文主要补充wait(),noti ...

  5. 同软件多个线程设置不同ip_5-13网络编程(附带多线程死锁,线程通信)

    0513多线程 死锁 当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步.这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁 线程通信 生产者消费者模式 模拟街道案例 wai ...

  6. 多线程的线程通信(生产消费)

    消费者线程 package com.bjsxt.commu5;/*** 消费者线程*/ public class ConsumeRunnable implements Runnable {//priv ...

  7. 3.2多线程(线程通信)

    1.线程间通讯: 多个线程在处理同一资源,但是任务却不同. 2.等待唤醒机制: 涉及的方法: 1.wait() 让线程处于冻结状态,被wait的线程会被存储到线程池.通过锁来区分线程池(等待集) 2. ...

  8. Linux多线程开发-线程同步-条件变量pthread_cond_t

    1.条件变量的概念 一个线程A的执行需要另一个线程B来唤醒,否则A挂起等待.线程B可以产生线程A继续执行的信号.条件变量常用在共享数据状态变化的场景中,例如:生产则和消费者问题.POSIX线程库提供了 ...

  9. Android 多线程及线程通信

    2019独角兽企业重金招聘Python工程师标准>>> AsyncTask AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对来说AsyncTask更轻 ...

  10. java线程池拒绝策略_Java核心知识 多线程并发 线程池原理(二十三)

    线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后 启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等候,等其它线程执行完毕, 再从队列中取出任务来执行.他 ...

最新文章

  1. java Graphics2D类
  2. Python入门100题 | 第066题
  3. Django入门:(admin.E108
  4. C/Cpp / Cpp 中 struct 和 class 区别
  5. Eliminate Witches!【2011年北京赛区正赛赛题-2】
  6. 从源码剖析SpringBoot中Tomcat的默认最大连接数
  7. hibernate的查询缓存
  8. 为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname
  9. C语言标准库<limits.h>
  10. 使用XmlPullParser解析XML
  11. android xml显示调整,AndroidStudio中怎么设置xml与预览同时显示?
  12. mysql 5.7参数配置_MySQL 5.7-新增配置参数
  13. Java中父类强制转换为子类的可能
  14. swift 数据存储
  15. 网络规划设计师的参考资料和复习书籍
  16. lazarus编译程序提示不能加载PostgreSQL客户端动态库“libpq.dll“
  17. 全国职称计算机题库视频,全国职称计算机考试题库模拟训练—windowsXP
  18. 人工智能会取代程序员吗?
  19. KeyStore(示例,出错代码)
  20. 关于web前端大作业的HTML网页设计——我的班级网页HTML+CSS+JavaScript

热门文章

  1. 容器技术Docker K8s 24 容器服务ACK基础与进阶-日志管理
  2. Bitwise AND of Numbers Range
  3. linux的abrt目录满了,linux:abrt-cli list
  4. MyEclipse问题收集
  5. Linux下的Libsvm使用历程录
  6. 最近写mapreduce程序从hbase中抽取程序遇到的一些问题
  7. Nodejs自带模块querystring的使用简介
  8. 数位DP算法概述及习题
  9. 503.下一个更大元素II(力扣leetcode) 博主可答疑该问题
  10. linux windows并发模型,LINUX环境并发服务器的三种实现模型