如何知道線程全部執(zhí)行完的幾種方式
在多線程開發(fā)中,我們經(jīng)常使用的線程池來實(shí)現(xiàn)多個(gè)線程的異步執(zhí)行。然而,如何判斷線程池中的所有子線程是否已經(jīng)全部執(zhí)行完畢呢?本文將介紹三種方法。 方案一:使用isTerminated()方法 使用is
在多線程開發(fā)中,我們經(jīng)常使用的線程池來實(shí)現(xiàn)多個(gè)線程的異步執(zhí)行。然而,如何判斷線程池中的所有子線程是否已經(jīng)全部執(zhí)行完畢呢?本文將介紹三種方法。
方案一:使用isTerminated()方法
使用isTerminated()方法可以判斷線程池中的所有子線程是否已經(jīng)執(zhí)行完畢。具體操作如下:
- 安裝并配置好JDK開發(fā)環(huán)境,打開eclipse開發(fā)工具。
- 通過Executors創(chuàng)建線程池,并提交任務(wù)。
- 使用isTerminated()方法判斷線程池是否已經(jīng)執(zhí)行完畢,返回結(jié)果為true即表示全部執(zhí)行完畢。
方案二:使用閉鎖(CountDownLatch)
閉鎖(CountDownLatch)是一種靈活的實(shí)現(xiàn)方式,它可以使一個(gè)或多個(gè)線程等待一組事件的發(fā)生。具體操作如下:
- 安裝并配置好JDK開發(fā)環(huán)境,打開eclipse開發(fā)工具。
- 通過Executors創(chuàng)建線程池,并提交任務(wù)。
- 使用CountDownLatch創(chuàng)建閉鎖,并設(shè)置等待的線程數(shù)。
- 每個(gè)子線程執(zhí)行完畢后,調(diào)用countDown()方法減少等待的線程數(shù)。
- 主線程通過await()方法等待所有子線程執(zhí)行完畢。
方案三:結(jié)合方案一和二的優(yōu)雅實(shí)現(xiàn)
結(jié)合方案一和二,可以得到另一種更加優(yōu)雅的實(shí)現(xiàn)方式。具體代碼如下:
public class ThreadExecutor {
private static final ExecutorService executor (5);
private static final CountDownLatch latch new CountDownLatch(5);
public static void main(String[] args) {
for (int i 0; i < 5; i ) {
(new Task(latch));
}
try {
();
("All threads have finished execution.");
} catch (InterruptedException e) {
();
} finally {
();
}
}
static class Task implements Runnable {
private final CountDownLatch latch;
public Task(CountDownLatch latch) {
latch;
}
@Override
public void run() {
// 執(zhí)行任務(wù)
();
}
}
}
以上三種方案各有利弊,選擇使用哪種方式取決于你對(duì)代碼的要求和具體需求。