`
qq466862016
  • 浏览: 128422 次
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 

 

0
1
分享到:
评论

相关推荐

    Java的多线程-线程间的通信.doc

    在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while (&lt;condition does not hold&gt;) obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的...

    Java多线程 - (一) 最简单的线程安全问题

    在Java编程中,多线程是并发处理任务的关键技术,特别是在服务器端开发和高并发场景下。本篇文章将深入探讨“最简单的线程安全问题”,并结合相关源码和工具来帮助理解。线程安全问题通常涉及到多个线程对共享资源的...

    Java多线程-多线程知识点总结和企业真题

    ### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...

    Java多线程-线程间的通信

    ### Java多线程—线程间的通信 #### 一、线程间的通信 ##### (1)为什么要处理线程间的通信? 在多线程环境中,不同的线程可能需要协同工作来完成一项任务。例如,一个线程负责生产数据,另一个线程负责消费这些...

    Java多线程之ReentrantLock与Condition - 平凡希 - 博客园1

    Java中的`ReentrantLock`是Java并发包`java.util.concurrent.locks`中的一个高级锁机制,它是可重入的互斥锁,具有与`synchronized`关键字...在设计和实现多线程程序时,了解和正确使用`ReentrantLock`是非常重要的。

    java多线程作业.docx

    ### Java多线程知识点解析 #### 一、Java多线程概述 Java作为一种现代编程语言,内置了对多线程的支持。多线程允许应用程序同时处理多个任务,从而提高程序的响应性和整体性能。在多线程环境中,一个程序可以包含...

    Java多线程资料

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了软件的效率和响应性。在Java中,多线程的实现主要有两种方式:通过继承Thread类和实现Runnable接口。这篇资料深入探讨了Java多线程的相关知识...

    Java-jdk10-最新最全多线程编程实战指南-核心篇

    《Java-jdk10-最新最全多线程编程实战指南-核心篇》是一本深入探讨Java多线程编程的专著,针对Java 10版本进行了全面的更新和优化。这本书聚焦于Java多线程的核心概念和技术,旨在帮助开发者理解和掌握如何在并发...

    java多线程

    由于提供的文件内容大部分与Java多线程编程核心技术并无直接关联,而是关于电子书资源的联系方式和说明,因此不能直接从这部分内容中生成关于Java多线程的知识点。但考虑到描述中提到了电子书的标题以及它涉及的主题...

    Java多线程练习题

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    人工智能-项目实践-多线程-多线程与高并发.zip

    此外,同步机制是多线程编程中的关键,包括互斥锁(synchronized关键字)、读写锁(ReentrantReadWriteLock)、条件变量(Condition)等,它们确保了共享数据在多线程环境下的安全性。避免死锁和活锁也是多线程编程...

    现代多线程 JAVA和c++多线程实现 测试和调试

    在现代软件开发中,多线程技术已经成为必不可少的一部分,特别是在JAVA和C++这样的高级编程语言中。多线程允许程序同时执行多个任务,提高应用程序的响应性和效率。本资源主要探讨了如何在JAVA和C++中实现多线程,...

    java-Thread-study-summary.zip_java 多线程

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,实现多线程有两种主要方式:继承`Thread`类和实现`Runnable`接口。本资料“java-Thread-study-summary.zip”...

    Java多线程运算集合

    ### Java多线程运算集合知识点解析 #### 一、Java多线程概念与原理 - **操作系统中的线程与进程**: - **进程**:指的是一个正在运行的应用程序,每个进程都拥有独立的内存空间。 - **线程**:是进程中的一个...

    java单线程多线程clientserver

    Java多线程则是为了解决这个问题而引入的概念。通过创建多个线程,程序可以在同一时间执行多个任务,提高了CPU的利用率和程序的响应速度。多线程可以分为并发和并行两种。并发是在单核CPU中,通过快速切换线程执行来...

    Java多线程技术精讲

    Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...

    Java-多线程教学文档

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,从而提高了CPU资源的利用率。本文档详细介绍了Java多线程的相关知识,包括概念、原理、创建、同步、调度以及新特性。 首先,理解多线程的...

    java经典多线程面试题

    在Java中,多线程是一种非常重要的编程概念,...这些面试题涵盖了Java多线程编程的基础知识、同步机制、线程间通信以及并发集合类等多个方面。在准备面试时,对这些问题进行深入理解和准备,能够有效提升面试的成功率。

Global site tag (gtag.js) - Google Analytics