Join
Thread t1 = new Thread(new run());
Thread t2 = new Thread(new run());
Thread t3 = new Thread(new run());
t1.join();
t2.join();
t3.join();
System.out.println("all former thread is dead!!!!!")
1.調(diào)用join()方法會(huì)阻塞當(dāng)前線程,直到被調(diào)用線程死亡
2.必須能獲取到被調(diào)用線程的對(duì)象鎖
CountDownLatch
CountDownLatch count = new?CountDownLatch(2)
new Thread(new runable(){
//do somethine
?count.countDown();
//go on do somethine
}).start();
//thread2.start()
count.await();
//go on do something
1. await()方法阻塞當(dāng)前線程
2.在子線程里調(diào)用?countDown()方法绍傲,并不會(huì)阻塞子線程扔傅,子線程也還是活的
cyclicBarrier
?CyclicBarrier barrier? = new CyclicBarrier(N);
new thread(new runable(){
//do somethine
barrier.await();
//do something
}).start()
1.在子線程中調(diào)用wait()方法,阻塞子線程
2.在所有線程到達(dá)wait()方法后烫饼,才一起執(zhí)行后面的自己的邏輯
3.可以在構(gòu)造函數(shù)中設(shè)置回調(diào)方法猎塞,在wait喚醒后執(zhí)行回調(diào)邏輯
semaphore
Semaphore?semaphore = new?semaphore(number);
new Thread(new runable(){
? ? ? ? ? ? ? ? semaphore.acquire();
????????????????System.out.println("get success");
????????????????Thread.sleep(2000);
????????????????System.out.println("finished my job ");
????????????????semaphore.release()
})
在同一線程中調(diào)用 semaphore.acquire(),如果獲取成功執(zhí)行代碼杠纵,否則阻塞荠耽,執(zhí)行完后再release,通知其它競(jìng)爭(zhēng)者