package com.viewhigh.mdop.bi.test; import org.junit.Test; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import static org.junit.Assert.*; /** * Created by zzq on 2017/5/11. */ public class MasterTest { @Test public void submitTask1() throws Exception {//6 7runnable没有参与Condition,执行位置不确定 final Lock lock = new ReentrantLock();//重入锁 Condition c1 = lock.newCondition(); Condition c2 = lock.newCondition(); Condition c3 = lock.newCondition(); Runnable runnable0 = new Runnable() { @Override public void run() { try { lock.lock(); System.out.println("0开始执行---"); System.out.println("0开始等待---"); c1.await();//相当于 Object与synchronized 的wait System.out.println("0已经被唤醒---"); Thread.sleep(2000); System.out.println("0执行结束---"); } catch (Exception e) { } finally { lock.unlock(); } } }; Runnable runnable1 = new Runnable() { @Override public void run() { try { lock.lock(); System.out.println("1开始执行---"); System.out.println("1开始等待---"); c1.await();//相当于 Object与synchronized 的wait System.out.println("1已经被唤醒---"); Thread.sleep(2000); System.out.println("1执行结束---"); } catch (Exception e) { } finally { lock.unlock(); } } }; Runnable runnable2 = new Runnable() { @Override public void run() { try { lock.lock(); System.out.println("2开始执行---"); System.out.println("2开始等待---"); c2.await(); Thread.sleep(2000); c1.signalAll();//相当于 所有的Thread中已经添加await的全部notify操作了,不带有all的仅仅唤醒第一个。而且 要等到所有线程全部正常执行后才会唤醒设置了await的线程 } catch (Exception e) { } finally { lock.unlock(); } } }; Runnable runnable3 = new Runnable() { @Override public void run() { try { lock.lock(); System.out.println("3开始执行---"); System.out.println("3开始等待---"); c2.await(); Thread.sleep(2000); System.out.println("3执行结束---"); } catch (Exception e) { } finally { lock.unlock(); } } }; Runnable runnable4 = new Runnable() { @Override public void run() { try { lock.lock(); System.out.println("4开始执行---"); System.out.println("4开始等待---"); c3.await(); c2.signalAll(); System.out.println("2执行结束,要等3执行结束后(3也是使用了c2的Condition的await),才唤醒r0和r1---"); Thread.sleep(2000); System.out.println("4执行结束---"); } catch (Exception e) { } finally { lock.unlock(); } } }; Runnable runnable5 = new Runnable() { @Override public void run() { try { lock.lock(); System.out.println("5开始执行---"); System.out.println("4将要被唤醒---"); c3.signal();//唤醒4线程 Thread.sleep(2000); System.out.println("5执行结束---"); } catch (Exception e) { } finally { lock.unlock(); } } }; Runnable runnable6 = new Runnable() { @Override public void run() { try { lock.lock(); System.out.println("6开始执行---"); Thread.sleep(2000); System.out.println("6执行结束---"); } catch (Exception e) { } finally { lock.unlock(); } } }; Runnable runnable7 = new Runnable() { @Override public void run() { try { lock.lock(); System.out.println("7开始执行---"); Thread.sleep(2000); System.out.println("7执行结束---"); } catch (Exception e) { } finally { lock.unlock(); } } }; Thread t0 = new Thread(runnable0); t0.start(); Thread t1 = new Thread(runnable1); t1.start(); Thread t2 = new Thread(runnable2); t2.start(); Thread t3 = new Thread(runnable3); t3.start(); Thread t4 = new Thread(runnable4); t4.start(); Thread t5 = new Thread(runnable5); t5.start(); Thread t6 = new Thread(runnable6); t6.start(); Thread t7 = new Thread(runnable7); t7.start(); while (t7.getState() != Thread.State.TERMINATED || t6.getState() != Thread.State.TERMINATED || t5.getState() != Thread.State.TERMINATED || t4.getState() != Thread.State.TERMINATED || t0.getState() != Thread.State.TERMINATED || t1.getState() != Thread.State.TERMINATED || t2.getState() != Thread.State.TERMINATED || t3.getState() != Thread.State.TERMINATED) { } System.out.println("全部结束---"); } }