多线程模式下,要控制线程执行顺序之前可以用join()方式,现在也可以用
countDownLatch(闭锁),A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.(一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。)
public class JDKCountDown {
private static final Random random = new Random(System.currentTimeMillis());
public static void main(String[] args) throws InterruptedException {
final CountDownLatch latch = new CountDownLatch(5);
System.out.println("准备多线程处理任务.");
//The first phase.
IntStream.rangeClosed(1, 5).forEach(i ->
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " is working.");
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
}, String.valueOf(i)).start()
);
latch.await();
//The second phase.
System.out.println("多线程任务全部结束,准备第二阶段任务");
System.out.println("............");
System.out.println("FINISH");
}
}
//=========================================================
/**
* 自定义闭锁
*/
public class CountDown {
private final int total; //线程数
private int counter = 0; //计数器
public CountDown(int total) {
this.total = total;
}
public void down() {
synchronized (this) {
this.counter++;
this.notifyAll();
}
}
public void await() throws InterruptedException {
synchronized (this) {
while (counter != total) {
this.wait();
}
}
}
}
//===========================================
public class CustomCountDownClient {
private static final Random random = new Random(System.currentTimeMillis());
public static void main(String[] args) throws InterruptedException {
final CountDown latch = new CountDown(5);
System.out.println("准备多线程处理任务.");
//The first phase.
IntStream.rangeClosed(1, 5).forEach(i ->
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " is working.");
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.down();
}, String.valueOf(i)).start()
);
latch.await();
//The second phase.
System.out.println("多线程任务全部结束,准备第二阶段任务");
System.out.println("............");
System.out.println("FINISH");
}