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
相关推荐
在Java多线程编程中,线程间的通信是非常重要的概念,用于协调多个并发执行的任务。线程的状态转换是理解线程通信的基础,主要包括四个状态:新(New)、可执行(Runnable)、死亡(Dead)和停滞(Blocked)。新状态...
多线程注意:wait()方法的调用要有判定条件常用 while (<condition does not hold>) obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的...
在Java编程中,多线程是并发处理任务的关键技术,特别是在服务器端开发和高并发场景下。本篇文章将深入探讨“最简单的线程安全问题”,并结合相关源码和工具来帮助理解。线程安全问题通常涉及到多个线程对共享资源的...
### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...
### Java多线程—线程间的通信 #### 一、线程间的通信 ##### (1)为什么要处理线程间的通信? 在多线程环境中,不同的线程可能需要协同工作来完成一项任务。例如,一个线程负责生产数据,另一个线程负责消费这些...
Java中的`ReentrantLock`是Java并发包`java.util.concurrent.locks`中的一个高级锁机制,它是可重入的互斥锁,具有与`synchronized`关键字...在设计和实现多线程程序时,了解和正确使用`ReentrantLock`是非常重要的。
### Java多线程知识点解析 #### 一、Java多线程概述 Java作为一种现代编程语言,内置了对多线程的支持。多线程允许应用程序同时处理多个任务,从而提高程序的响应性和整体性能。在多线程环境中,一个程序可以包含...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了软件的效率和响应性。在Java中,多线程的实现主要有两种方式:通过继承Thread类和实现Runnable接口。这篇资料深入探讨了Java多线程的相关知识...
《Java-jdk10-最新最全多线程编程实战指南-核心篇》是一本深入探讨Java多线程编程的专著,针对Java 10版本进行了全面的更新和优化。这本书聚焦于Java多线程的核心概念和技术,旨在帮助开发者理解和掌握如何在并发...
由于提供的文件内容大部分与Java多线程编程核心技术并无直接关联,而是关于电子书资源的联系方式和说明,因此不能直接从这部分内容中生成关于Java多线程的知识点。但考虑到描述中提到了电子书的标题以及它涉及的主题...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
此外,同步机制是多线程编程中的关键,包括互斥锁(synchronized关键字)、读写锁(ReentrantReadWriteLock)、条件变量(Condition)等,它们确保了共享数据在多线程环境下的安全性。避免死锁和活锁也是多线程编程...
在现代软件开发中,多线程技术已经成为必不可少的一部分,特别是在JAVA和C++这样的高级编程语言中。多线程允许程序同时执行多个任务,提高应用程序的响应性和效率。本资源主要探讨了如何在JAVA和C++中实现多线程,...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,实现多线程有两种主要方式:继承`Thread`类和实现`Runnable`接口。本资料“java-Thread-study-summary.zip”...
### Java多线程运算集合知识点解析 #### 一、Java多线程概念与原理 - **操作系统中的线程与进程**: - **进程**:指的是一个正在运行的应用程序,每个进程都拥有独立的内存空间。 - **线程**:是进程中的一个...
Java多线程则是为了解决这个问题而引入的概念。通过创建多个线程,程序可以在同一时间执行多个任务,提高了CPU的利用率和程序的响应速度。多线程可以分为并发和并行两种。并发是在单核CPU中,通过快速切换线程执行来...
Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,从而提高了CPU资源的利用率。本文档详细介绍了Java多线程的相关知识,包括概念、原理、创建、同步、调度以及新特性。 首先,理解多线程的...
在Java中,多线程是一种非常重要的编程概念,...这些面试题涵盖了Java多线程编程的基础知识、同步机制、线程间通信以及并发集合类等多个方面。在准备面试时,对这些问题进行深入理解和准备,能够有效提升面试的成功率。