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后端系统架构之消息队列篇:kafka的实验

分布式队列kafka
  • wh0426
  • wh0426
  • 2015年04月09日 09:35
  • 1740

Java基础—线程间通信

——- android培训、java培训、期待与您交流! ———-

Java中的Condition --使线程间通信更高效

Condition的使用代码 例
  • xuhu_it
  • xuhu_it
  • 2014年05月11日 21:55
  • 358

多线程__【线程间通信】【等待唤醒机制】【多生产多消费】【Lock&Condition接口】

---------------------------------------- android培训、java培训、期待与您交流! --------------------------------...

Java线程间通信-回调的实现方式

转载 : http://lavasoft.blog.51cto.com/62575/98796/ Java线程间通信-回调的实现方式   Java线程间通信是非常复杂的问题的。线程间通信问题...

【Java并发编程】之十:使用wait/notify/notifyAll实现线程间通信的几点重要说明

在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信。在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调...

JAVA 学习模块十九: 线程间通信

线程通信 等待唤醒机制 生产一只卖一只 多生产多消费 lock 接口 停止线程1.线程通信/* 线程间通信: 多个线程,运行任务不一样,处理资源一样。*/ //资源 class Resource { ...

Java多线程-2 基本线程间通信 && volatile keyword

这里是通过在主线程中终止一个用户线程的操作的例子。但在本内容之前需要首先了解Java内存模型。 1. java内存模型:指定了虚拟机和Java内存RAM是如何运作的这里是关于java内存模型的详细资料...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 之 Condition 线程间通信
举报原因:
原因补充:

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