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("全部结束---");
}
}