CountDownLatch:線程計(jì)數(shù)器,等待其他線程完成,再執(zhí)行主線程
CountDownLatch latch = new CountDownLatch(2);//聲明一個(gè)CountDownLatch,計(jì)數(shù)器為2
常用方法:
| method | description |
|---|---|
| await() | 線程被掛起,它會(huì)等待直到count值為0才繼續(xù)執(zhí)行 |
| await(long timeout, TimeUnit unit) | 線程被掛起,設(shè)置超時(shí)時(shí)間,如果到了超時(shí)時(shí)間count還不為0,則將會(huì)繼續(xù)向下執(zhí)行,執(zhí)行主線程 |
| countDown() | 講count計(jì)數(shù)器做減1操作 |
應(yīng)用場(chǎng)景
當(dāng)我們要做一個(gè)2W條的查詢,如果單線程運(yùn)行等待的時(shí)間會(huì)非常久,這時(shí)我們可以考慮運(yùn)行2個(gè)子線線程并行查詢,每個(gè)子線程查詢1W條數(shù)據(jù),等子線程查詢都結(jié)束后,再交由主線程進(jìn)行匯總處理。
代碼如下:
import java.util.concurrent.CountDownLatch;
/**
* 線程計(jì)數(shù)器,等待其他線程完成,再執(zhí)行主線程,例:并發(fā)查詢
*/
public class CountDownLatchTest {
public static void main(String[] args) throws InterruptedException {
final int threadSize = 2;
CountDownLatch latch = new CountDownLatch(threadSize);
for (int i =1;i<=threadSize;i++){
final int x =i;
new Thread(()->{
System.out.println("第"+x+"個(gè)線程查詢,正在運(yùn)行");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("第"+x+"個(gè)線程查詢,運(yùn)行完畢");
latch.countDown();
}).start();
}
System.out.println("等待所有查詢查詢完畢");
latch.await();
System.out.println("所有查詢查詢完畢");
System.out.println("繼續(xù)執(zhí)行主線程匯總。。。。。。。");
}
}
執(zhí)行結(jié)果
等待所有查詢查詢完畢
第1個(gè)線程查詢,正在運(yùn)行
第2個(gè)線程查詢,正在運(yùn)行
第1個(gè)線程查詢,運(yùn)行完畢
第2個(gè)線程查詢,運(yùn)行完畢
所有查詢查詢完畢
繼續(xù)執(zhí)行主線程匯總。。。。。。。