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
相关推荐
多线程注意:wait()方法的调用要有判定条件常用 while (<condition does not hold>) obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的...
1、ReentrantLock简介 2、ReentrantLock函数列表 3、重入的实现 4、公平锁与非公平锁 5、ReentrantLock 扩展的功能 6
java多线程实现生产者和消费者 ,4种实现方式,分别为synchronizated,condition和lock,信号量,阻塞队列
在char01包里放置Java多线程基本知识的代码。内容如下: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 在char02包里放置了Java对变量和对象并发访问的知识的代码...
主要介绍了Java多线程中ReentrantLock与Condition详解,需要的朋友可以参考下
利用线程间的通信主要是因为当多个线程同时对一个对象进行访问的时候,多个线程之间是一个协助的关系,举个例子就是今天要说的生产这和消费者模型。
多线程同步解决卖票问题
主要介绍了java多线程加锁以及Condition类的使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...
java 并发 编程 多线程 concurrent lock condition executorserice executor java.util.curcurrent.
Java多线程入阶干货分享 1.使用线程的经验:设置名称、响应中断、使用ThreadLocal 2.Executor:ExecutorService和Future 3.阻塞队列:put和take、offer和poll、drainTo 4.线程间通信:lock、condition、wait、notify...
Condition是java.util.concurrent.locks包下的类,提供了对线程锁的更精细的控制方法,下面我们就来看一下Java多线程编程中使用Condition类操作锁的方法详解
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
创建多个condition对象 一个condition对象的signal(signalAll)方法和该对象的await方法是一一对应的,也就是一个condition对象的signal(signalAll)方法不能唤醒其他condition对象的await方法 ReentrantLock...
本书全面解析了Java并发编程的核心概念、原理和实践,帮助读者深入理解多线程并发编程的精髓,提升编程能力和系统性能。 书中首先介绍了并发编程的基础知识,包括线程的基本概念、线程的生命周期、线程安全等问题。...
主要介绍了Java编程中实现Condition控制线程通信,简单介绍了Java中控制线程通信的方法,以及对condition的解析和实例,具有一定参考价值,需要的朋友可以了解下。
JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...
5.将生命游戏由单线程模式改为多线程模式,使用n个线程并行读取初始pgm文件,把图像分割为n份,分别计算出下一轮的细胞状态,然后重新整合为一个新一代细胞状态图。要求程序无死锁(Deadlock Free),无竞争条件(No...
7 一个支持多线程的服务器框架 13. 8 代理服务器 13. 9 Telnet客户端 13. 10 UDP编程 13. 11 聊天室服务器端 13. 12 聊天室客户端 13. 13 FTP客户端 第14章 数据库 14. 1 连接各种...
全书通过60多个简单而非常有效的实例,帮助读者快速掌握Java 7多线程应用程序的开发技术。学习完本书,你可以将这些开发技术直接应用到自己的应用程序中。 《Java 7并发编程实战手册》适合具有一定Java编程基础的...