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