接上一篇,实现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() { @Override
public void run() {
for (int i = 1; i <= 5; i++) {
// 循环运行5次
tasks.sub2(i);
} }
}).start(); // 3号线程
new Thread(new Runnable() { @Override
public 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 block
e.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 block
e.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 block
e.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. 多线程之线程通信条件Condition

    Condition是Locks锁下的还有一种线程通信之间唤醒.堵塞的实现.它以下的await,和signal可以实现Object下的wait,notify和notifyAll的所有功能,除此之外改监视 ...

  2. Java之多线程开发时多条件Condition接口的使用

    转:http://blog.csdn.net/a352193394/article/details/39454157 我们在多线程开发中,可能会出现这种情况.就是一个线程需要另外一个线程满足某某条件才 ...

  3. java 多线程:线程通信-等待通知机制wait和notify方法;(同步代码块synchronized和while循环相互嵌套的差异);管道通信:PipedInputStream;PipedOutputStream;PipedWriter; PipedReader

    1.等待通知机制: 等待通知机制的原理和厨师与服务员的关系很相似: 1,厨师做完一道菜的时间不确定,所以厨师将菜品放到"菜品传递台"上的时间不确定 2,服务员什么时候可以取到菜,必 ...

  4. Scala学习笔记之Actor多线程与线程通信的简单例子

    题目:通过子线程读取每个文件,并统计单词数,将单词数返回给主线程相加得出总单词数 package review import scala.actors.{Actor, Future} import s ...

  5. java 多线程 day04 线程通信

    package com.czbk.thread; /** * Created by chengtao on 17/12/3. * 需求: 子线程先运行10次,然后主线程运行 100次,依次运行50次 ...

  6. java多线程(线程通信-等待换新机制-代码优化)

    等待唤醒机制涉及方法: wait():让线程处于冻结状态,被wait的线程会被存储到线程池中. noticfy():唤醒同一个线程池中一个线程(任意也可能是当前wait的线程) notifyAll() ...

  7. 6.显示锁Lock 和 线程通信Condition

    显示锁 Lock 一.用于解决多线程 安全问题的方式: synchronized:   1.同步代码块      2.同步方法 jdk1.5 后:第三种:同步锁Lock  (注意:同步(synchro ...

  8. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

  9. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

随机推荐

  1. vmware-虚拟机播放器的下载、安装

    如果是在window下安装的话: 1.下载vmware: 到官网下载免费个人版本 https://my.vmware.com/cn/web/vmware/free#desktop_end_user_c ...

  2. 1.22 Python基础知识 - 正则表达式

    Python正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re ...

  3. CSS min-height不能解决垂直外边距合并问题

    垂直外边距合并有一种情况是嵌套元素的垂直外边距合并,当父级元素没有设定外边距时,在顶部或者底部边缘的子元素的垂直外边距就会和父级的合并,导致父级也有了“隐形”的垂直外边距. 当父级元素的min-hei ...

  4. Zorka和zico实现不同主机之间的交互

    之前参考下面的两篇博文进行了zorka以及其collector端zico的配置. http://quyuxjtu.sinaapp.com/?p=532 http://quyuxjtu.sinaapp. ...

  5. WebForm使用JQuery实现DropDownList无刷新联动

    目录(?)[-] 1  JS代码 2 页面相关控件用的是平台封装的控件普通DropDownList也可以 3 后台C代码 注意事项   原来用的微软封装的Ajax控件UpdatePannel和Scri ...

  6. android studio执行 Information:Gradle tasks [:app:assembleDebug]失败处理

    Error:Execution failed for task ‘:app:mergeDebugResources’. > Some file crunching failed, see log ...

  7. [appium]-9宫格解锁方法

    from appium.webdriver.common.touch_action import TouchAction TouchAction(self.driver).press(x=228,y= ...

  8. Java Web学习总结(6)——通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 package gacl.res ...

  9. Altium Designer一些问题

    1,当你重新导入原理图的时候,会提示删除类 2,不要粘贴和赋值pcb中的原件,否则飞线可能会消失

  10. JS学习笔记 - 透明度运动框

    该练习的笔记如下: 1.  var cur=0;  //先声明一个变量. 2.  parseInt会舍掉小数,而opacity值恰恰是小数,所以对于opacity,必须用parseFloat. cur ...