java 之 Condition 线程间通信

原创 2012年03月22日 00:00:50
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class ConditionCommunicationTest {

	public static void main(String[] args) {
		final Business business = new Business();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				for(int i=1;i<=50;i++) {
					business.sub(i);
				}
			}
		}).start();
		
		for(int i=1;i<=50;i++) {
			business.main(i);
		}
	}
	
	static class Business {
		//synchronized 用 lock替代
		Lock lock = new ReentrantLock();
		Condition condition = lock.newCondition();
		
		private boolean bShouldSub = true;//子线程
		
		//处理子线程
		public void sub(int i) {
			lock.lock();
			
			try {
				//如果不是子线程
				while(!bShouldSub) {
					try {
						condition.await();
					} catch(InterruptedException e) {
						e.printStackTrace();
					}
				}
				
				for(int j=1;j<=10;j++) {
					System.out.println("sub thread sequence of "+j + " loop of "+i);
				}
				
				bShouldSub = false;
				condition.signal();
			} finally {
				lock.unlock();
			}
			
		}
		
		//处理子线程
				public synchronized void main(int i) {
					lock.lock();
					try {
						//如果是子线程,主线程等待
						while(bShouldSub) {
							try {
								condition.await();
							} catch(InterruptedException e) {
								e.printStackTrace();
							}
						}
						
						for(int j=1;j<=10;j++) {
							System.out.println("main thread sequence of "+j + " loop of "+i);
						}
						
						bShouldSub = true;
						condition.signal();
					} finally {
						lock.unlock();
					}
					
				}
	}
}

	/*static class Business {
		private boolean bShouldSub = true;//子线程
		
		//处理子线程
		public synchronized void sub(int i) {
			//如果不是子线程
			while(!bShouldSub) {
				try {
					this.wait();
				} catch(InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			for(int j=1;j<=10;j++) {
				System.out.println("sub thread sequence of "+j + " loop of "+i);
			}
			
			bShouldSub = false;
			this.notify();
		}
		
		//处理子线程
				public synchronized void main(int i) {
					//如果是子线程,主线程等待
					while(bShouldSub) {
						try {
							this.wait();
						} catch(InterruptedException e) {
							e.printStackTrace();
						}
					}
					
					for(int j=1;j<=10;j++) {
						System.out.println("main thread sequence of "+j + " loop of "+i);
					}
					
					bShouldSub = true;
					this.notify();
				}
	}
}
*/

[疯狂Java]多线程:线程通信(监控器信号、Condition信号、阻塞队列)

1. 线程通信的概念:     1) 即线程之间以信号的方式(发送/接收信号)相互协调,协调的内容是调度; !!通常调度都是有调度器完成的,程序员无法插手(完全是透明的),但不过在有些情况下还是有人为...
  • Lirx_Tech
  • Lirx_Tech
  • 2016年03月18日 16:08
  • 790

用Condition条件变量实现生产者消费者模式

import java.util.LinkedList; import java.util.concurrent.locks.Condition; import java.util.concurren...
  • jb_peng
  • jb_peng
  • 2016年04月01日 17:40
  • 833

线程间通信:Condition | 信号量:Semaphore

线程间通信:Condition         对于线程间通信,大家最熟悉的莫过于Object.wait()、Object.notify()了。Condition的使用与前面的方法类似。 ...
  • wuxian90
  • wuxian90
  • 2017年08月13日 15:11
  • 158

python 线程间通信方法一:event 示例

参考了网上的说明,经测试的示例如下: 主要是采用了event的三个方法,即set、clear、wait #! /usr/bin/python ''' Created on Ap...
  • crazy_fire
  • crazy_fire
  • 2012年04月24日 11:08
  • 1298

java condition使用及分析

背景:     上一篇文章基于object的wait、notify实现了生产者、消费者模式。本篇文章继续梳理Condition。 condition 介绍及demo  Condition是在jav...
  • bohu83
  • bohu83
  • 2016年04月08日 17:07
  • 3653

Java多线程开发之~~~多条件Condition接口的使用

我们在多线程开发中,可能会出现这种情况。就是一个线程需要另外一个线程满足某某条件才能继续运行,或者需 要其他线程满足好几个条件才能运行,对于这样的多条件的多线程并发,我们如何控制好各个线程之间的关系,...
  • a352193394
  • a352193394
  • 2014年09月21日 19:33
  • 3687

java中的Condition

一、概述 该接口位于java.util.concurrent.locks 声明:public interface Condition  Condition 将 Object 监视器方法(wait...
  • u010142437
  • u010142437
  • 2015年01月07日 16:45
  • 3677

Java多线程Condition接口原理详解

Condition接口提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的 Condition接口详解Condition定义了等待...
  • fuyuwei2015
  • fuyuwei2015
  • 2017年05月21日 19:15
  • 1028

java并发锁ReentrantLock源码分析二之Condition实现原理

本文深入分析了并发锁ReentrantLock Condtion的实现原理,一个很重要的关键是await先释放锁,然后阻塞,在条件队列中等待被唤醒,每个CondtionObject维护着一个条件队列,...
  • prestigeding
  • prestigeding
  • 2016年11月14日 13:55
  • 2047

java多线程--condition条件

概要 前面对JUC包中的锁的原理进行了介绍,本章会JUC中对与锁经常配合使用的Condition进行介绍,内容包括: Condition介绍 Condition函数列表 Condition示例...
  • wangxiaotongfan
  • wangxiaotongfan
  • 2016年07月24日 20:56
  • 2392
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 之 Condition 线程间通信
举报原因:
原因补充:

(最多只允许输入30个字)