http://wingjay.com/2017/04/09/Java%E9%87%8C%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%BA%BF%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%EF%BC%9F/
1弦蹂、thread.join狡刘。
在線程B中加上線程A A.join()方法會(huì)讓線程B等到線程A運(yùn)行完畢后執(zhí)行。
2晚胡、object.wait()醋虏,object.notify()飘蚯。
首先創(chuàng)建一個(gè)A和B線程共享的對(duì)象鎖lock = new Object(); 然后在A和B的執(zhí)行代碼塊加上synchronized鎖
線程A獲得鎖開始執(zhí)行睁本,調(diào)用lock.wait()檀葛,交出鎖的控制權(quán)队丝,線程B獲得鎖開始執(zhí)行靡馁,執(zhí)行結(jié)束后調(diào)用lock.notify()方法,喚醒正在wait的線程A,繼續(xù)執(zhí)行机久。
3臭墨、CountDownLatch? countDownLatch.await(),countDownLatch.countDown膘盖。
首先創(chuàng)建一個(gè)CountDownLatch對(duì)象胧弛,構(gòu)造參數(shù)傳遞需要等待的數(shù)量4,先創(chuàng)建一個(gè)線程D開始執(zhí)行衔憨,在線程D中調(diào)用countDownLatch.await()方法進(jìn)入等待叶圃,直到計(jì)數(shù)變?yōu)?,一次創(chuàng)建線程A,B,C践图,每個(gè)線程執(zhí)行結(jié)束時(shí)調(diào)用countDownLatch.countDown方法掺冠,該方法將會(huì)將計(jì)數(shù)值減少1。當(dāng)所有其他線程執(zhí)行完,計(jì)數(shù)值為0德崭,等待線程D中的wait方法退出斥黑,開始執(zhí)行后續(xù)操作。
4眉厨、CyclicBarrier?cyclicBarrier.await();
首先創(chuàng)建一個(gè)CyclicBarrier對(duì)象锌奴,構(gòu)造參數(shù)傳入需要等待的數(shù)據(jù),然后依次創(chuàng)建線程ABC,每個(gè)線程中做不同時(shí)長(zhǎng)的事務(wù)憾股,線程內(nèi)調(diào)用cyclicBarrier.await()方法鹿蜀,進(jìn)入等待狀態(tài),當(dāng)所有線程都調(diào)用完await方式后服球,所有線程開始同時(shí)執(zhí)行后續(xù)流程茴恰。
5、FutureTask? ?Callable
首先創(chuàng)建一個(gè)Callable接口斩熊,在call方法中執(zhí)行需要做的事件往枣。然后new一個(gè)FutureTask任務(wù),構(gòu)造參數(shù)傳入Callable接口的實(shí)例粉渠,然后在創(chuàng)建一個(gè)線程并啟動(dòng)分冈,線程參數(shù)傳入的就是這個(gè)FutureTask任務(wù)。當(dāng)我們調(diào)用futureTask.get獲取子線程執(zhí)行結(jié)果時(shí)霸株,會(huì)阻塞主線程雕沉,當(dāng)子線程執(zhí)行結(jié)束后,futureTask.get返回結(jié)果淳衙,主線程恢復(fù)蘑秽。如果不希望阻塞主線程饺著,可以考慮利用?ExecutorService箫攀,把?FutureTask?放到線程池去管理執(zhí)行
6、sleep() 和 wait() 的區(qū)別就是 調(diào)用sleep方法的線程不會(huì)釋放對(duì)象鎖幼衰,而調(diào)用wait() 方法會(huì)釋放對(duì)象鎖