3、Java5多线程---Condition的使用

Java5多线程-Condition的使用

        在上节我们学习了在java.util.concurrent.locks包下的Lock的使用,现在我们来看下Condition的使用,Condition将Object监视器方法(wait、notify、notifyAll)分解成截然不同的对象,以便通过这些对象与任意的Lock实现组合使用,为每个对象提供多个等待set ,其中在java5及以后 我们用Lock代替了synchronized方法和代码块,Condition代替了Object的监视器方法。

      Condition为线程提供了一个条件的含义,以便在某个状态条件现在可能为true的另外一个线程通知它之前,一直挂起该线程让它进行等待。因为为力共享状态信息下必须保护它。Condition实例实质上被绑定到一个锁上,要为特定的Lock实例获得Condition实例,我们使用newCondition()方法。下面我们用一个经典的子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次例子来阐述Condition的用法。

package java5;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


/***
 * 子线程循环10次,接着主线程循环100,
 * 接着又回到子线程循环10次,
 * 接着再回到主线程又循环100,如此循环50次
 * @author dongtian
 * @date   2015年6月16日 上午9:48:43
 */
public class ConditionTest {

	//是否执行子线程
	private static boolean runSub = true;
	//是否执行主线程
	private static boolean runMain = true;
	//创建锁
	private static Lock lock = new ReentrantLock();
	
	private static Condition condition = lock.newCondition();
	
	public static void main(String[] args) {
		
		final Task task = new Task();
		//创建子线程并执行50次任务
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				for (int i = 0; i < 50; i++) {
					task.sub();
				}
			}
		}).start();
		
		//主线程执行50次任务
		for (int i = 0; i < 50; i++) {
			task.main();
		}
	}
	

	public static class Task {
		
		
		public void sub() {
			try {
				lock.lock();
				while (!runSub) {
					System.err.println("我是子线程要等待");
					condition.await();
				}
				
				System.err.println("子线程开始执行任务了.....");
				for (int i = 1; i <=5; i++) {
					
					System.err.println("我是子线程 执行了 " + i +"次");
				}
				
				runSub = false;
				runMain = true;
				condition.signal();
				
			} catch (Exception e) {
			} finally {
				lock.unlock();
			}
		}
		
		public void main(){
			try {
				lock.lock();
				while (!runMain) {
					System.err.println("我是主线程要等待。。。。");
					condition.await();
				}
				System.err.println("主线程开始执行任务了.....");
				for (int i = 1; i <=5; i++) {
					
					System.err.println("我是主线程执行" + i + "次");
				}
				
				runMain = false;
				runSub = true;
				condition.signal();
				
			} catch (Exception e) {
			} finally {
				lock.unlock();
			}
		}
	}
}

 运行结果:

主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
我是主线程要等待。。。。
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
我是子线程要等待
主线程开始执行任务了.....
我是主线程执行1次
我是主线程执行2次
我是主线程执行3次
我是主线程执行4次
我是主线程执行5次
我是主线程执行6次
我是主线程执行7次
我是主线程执行8次
我是主线程执行9次
我是主线程执行10次
子线程开始执行任务了.....
我是子线程 执行了 1次
我是子线程 执行了 2次
我是子线程 执行了 3次
我是子线程 执行了 4次
我是子线程 执行了 5次
.....

 二、来自官方api的例子

假设有一个绑定的缓冲区,它支持put和take方法,如果试图在空的缓冲区上执行take操作,则在某一项便得可用之前。线程将一直阻塞;如果试图在满的缓冲区上执行put操作,则在有空间变得可用之前,线程将一直阻塞。我们喜欢在单独的等待set中保存put线程和take线程,这样可以在缓冲区中的项货空间变得可用时利用最佳,一次只通知一个线程,可以使用2个Condition 实例来做到这一点。代码如下:

package java5;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/***
 * Condition的用法
 * 使用2个Condition实例
 * @author dongtian
 * @date   2015年6月16日 上午11:02:31
 */
public class BoundedBuffer {

	private Lock lock = new ReentrantLock();
	private Condition isNotFullCondition = lock.newCondition();
	private Condition isNotNullCondition = lock.newCondition();
	final Object[] items = new Object[10];
	int count = 0;
	int putIndex,takeIndex ;
	public void put(Object obj) {
		
		lock.lock();
		try {
			
			while(count == items.length) {
				System.err.println("缓冲区已经满了.....线程等待");
				isNotFullCondition.await();
			}
			
			items[putIndex] = obj;
			if(++putIndex == items.length) putIndex = 0;
			count ++;
			isNotNullCondition.signal();
		} catch (Exception e) {
		}finally {
			lock.unlock();
		}
	}
	
	public Object take() {
		Object obj  = null;
		lock.lock();
		try {
			
			while(count == 0) {
				System.err.println("缓冲区中数据为空了.....线程等待");
				isNotNullCondition.await();
			}
			 obj = items[takeIndex];
			if(++takeIndex == items.length ) {
				takeIndex =0;
			}
			count --;
			isNotFullCondition.signal();
		} catch (Exception e) {
		} finally {
			lock.unlock();
		}
		
		return obj;
	}
	
	public static void main(String[] args) {
		final BoundedBuffer boundedBuffer = new BoundedBuffer();
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				for (int i = 0; i < 25; i++) {
					System.err.println(" puting " +i);
					boundedBuffer.put("冬天" +i);
				}
			}
		}).start();
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				for (int i = 0; i < 20; i++) {
					Object obj = boundedBuffer.take();
					System.err.println("take " +obj);
				}
			}
		}).start();
	}
}

 运行结果如下:

缓冲区中数据为空了.....线程等待
 puting 0
take 冬天0
缓冲区中数据为空了.....线程等待
 puting 1
take 冬天1
缓冲区中数据为空了.....线程等待
 puting 2
take 冬天2
缓冲区中数据为空了.....线程等待
 puting 3
take 冬天3
缓冲区中数据为空了.....线程等待
 puting 4
take 冬天4
缓冲区中数据为空了.....线程等待
 puting 5
take 冬天5
缓冲区中数据为空了.....线程等待
 puting 6
take 冬天6
缓冲区中数据为空了.....线程等待
 puting 7
take 冬天7
缓冲区中数据为空了.....线程等待
 puting 8
take 冬天8
缓冲区中数据为空了.....线程等待
 puting 9
take 冬天9
缓冲区中数据为空了.....线程等待
 puting 10
take 冬天10
缓冲区中数据为空了.....线程等待
 puting 11
take 冬天11
缓冲区中数据为空了.....线程等待
 puting 12
take 冬天12
缓冲区中数据为空了.....线程等待
 puting 13
take 冬天13
缓冲区中数据为空了.....线程等待
 puting 14
take 冬天14
缓冲区中数据为空了.....线程等待
 puting 15
take 冬天15
缓冲区中数据为空了.....线程等待
 puting 16
take 冬天16
缓冲区中数据为空了.....线程等待
 puting 17
take 冬天17
缓冲区中数据为空了.....线程等待
 puting 18
take 冬天18
缓冲区中数据为空了.....线程等待
 puting 19
take 冬天19
 puting 20
 puting 21
 puting 22
 puting 23
 puting 24

猜你喜欢

转载自qq466862016.iteye.com/blog/2219998