国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

for循環(huán)內線程池并發(fā)執(zhí)行任務,等到子線程全部處理完任務,主線程在執(zhí)行java的實現方式

這篇具有很好參考價值的文章主要介紹了for循環(huán)內線程池并發(fā)執(zhí)行任務,等到子線程全部處理完任務,主線程在執(zhí)行java的實現方式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

for循環(huán)內線程池并發(fā)執(zhí)行任務,等到子線程全部處理完任務,主線程在執(zhí)行

方式一 使用 CountDownLatch

在 Java 中,您可以使用 CountDownLatch 來實現主線程等待子線程執(zhí)行完成的功能。CountDownLatch 是一個同步工具類,它允許一個或多個線程等待其他線程完成操作后再繼續(xù)執(zhí)行。

具體來說,您可以在每個子線程中創(chuàng)建一個 CountDownLatch 對象,并將計數器初始化為 1。當子線程處理完任務后,調用 CountDownLatch.countDown() 方法,將計數器減 1。在主線程中,調用 CountDownLatch.await() 方法阻塞等待所有子線程的任務執(zhí)行完畢,直到計數器減為 0 才繼續(xù)執(zhí)行后續(xù)代碼。

以下是一個簡單的示例代碼:

ExecutorService executor = Executors.newFixedThreadPool(5); // 創(chuàng)建擁有 5 個線程的線程池

CountDownLatch latch = new CountDownLatch(5); // 創(chuàng)建計數器,初始值為 5

for (int i = 0; i < 5; i++) {
    executor.submit(() -> {
        // 子線程處理任務
        doTask();

        latch.countDown(); // 計數器減 1
    });
}

try {
    latch.await(); // 等待所有子線程的任務執(zhí)行完畢
} catch (InterruptedException e) {
    // 處理中斷異常
}

// 所有子線程的任務都已經執(zhí)行完畢,執(zhí)行主線程的代碼
doSomethingElse();

請注意,在實際應用中,您還需要考慮線程安全、并發(fā)訪問等問題,并在代碼中正確處理異常。例如,在子線程處理任務時,可能需要使用鎖或其他同步機制來保護共享資源的訪問;在主線程等待子線程執(zhí)行完畢時,可能需要處理 InterruptedException 異常等異常情況。

方式二 使用 ExecutorService 的 invokeAll() 方法

如果您不想使用 CountDownLatch,還有其他方法可以實現主線程等待子線程任務執(zhí)行完畢的功能。以下是一些常見的方式:

使用 ExecutorService 的 invokeAll() 方法
ExecutorService 中的 invokeAll() 方法可以提交多個 Callable 或 Runnable 任務,并阻塞等待所有任務完成。該方法返回一個 Future 對象列表,可以通過遍歷列表獲取各個子線程處理任務后的結果。

以下是一個使用 invokeAll() 方法的示例代碼

ExecutorService executor = Executors.newFixedThreadPool(5); // 創(chuàng)建擁有 5 個線程的線程池

List<Callable<Void>> tasks = new ArrayList<>();
for (int i = 0; i < 5; i++) {
    tasks.add(() -> {
        // 子線程處理任務
        doTask();
        return null;
    });
}

executor.invokeAll(tasks); // 等待所有子線程的任務執(zhí)行完畢

// 所有子線程的任務都已經執(zhí)行完畢,執(zhí)行主線程的代碼
doSomethingElse();

方式三 使用 CompletableFuture 的 allOf() 方法

Java 8 中引入了 CompletableFuture 類,它提供了一系列基于回調函數的異步編程方法,可以方便地實現多線程任務的并發(fā)執(zhí)行和結果組合。其中,allOf() 方法可以用于等待所有 CompletableFuture 對象的計算結果。

以下是一個使用 CompletableFuture 的 allOf() 方法的示例代碼:

ExecutorService executor = Executors.newFixedThreadPool(5); // 創(chuàng)建擁有 5 個線程的線程池

List<CompletableFuture<Void>> futures = new ArrayList<>();
for (int i = 0; i < 5; i++) {
    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
        // 子線程處理任務
        doTask();
    }, executor);
    futures.add(future);
}

CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); // 等待所有子線程的任務執(zhí)行完畢

// 所有子線程的任務都已經執(zhí)行完畢,執(zhí)行主線程的代碼
doSomethingElse();

請注意,在使用以上方法時,仍然需要考慮線程安全、并發(fā)訪問等問題,并在代碼中正確處理異常。

方式四
ThreadPoolExecutor executor = new ThreadPoolExecutor(
    5, // corePoolSize
    5, // maximumPoolSize
    0L, TimeUnit.MILLISECONDS, // keepAliveTime, unit
    new LinkedBlockingQueue<Runnable>()); // workQueue

AtomicInteger count = new AtomicInteger(5); // 計數器,初始值為 5

for (int i = 0; i < 5; i++) {
    executor.execute(() -> {
        // 子線程處理任務
        doTask();

        count.decrementAndGet(); // 計數器減 1
    });
}

while (count.get() > 0) {
    Thread.sleep(100); // 等待一段時間,避免空轉浪費 CPU 資源
}

// 所有子線程的任務都已經執(zhí)行完畢,執(zhí)行主線程的代碼
doSomethingElse();

在上述代碼中,我們創(chuàng)建了一個 ThreadPoolExecutor 對象,然后通過 AtomicInteger 實現了一個計數器,初始值為 5。在每個子線程執(zhí)行完任務后,計數器的值減 1。在主線程中使用 while 循環(huán)檢查計數器是否為 0,如果未達到目標,則阻塞等待一段時間,避免空轉浪費 CPU 資源。當計數器減為 0 時,所有子線程的任務都已經執(zhí)行完畢,主線程可以執(zhí)行后續(xù)代碼。

請注意,在使用自定義線程池時,需要考慮線程安全、并發(fā)訪問等問題,并在代碼中正確處理異常。例如,在子線程處理任務時,可能需要使用鎖或其他同步機制來保護共享資源的訪問;在主線程等待子線程執(zhí)行完畢時,可能需要處理 InterruptedException 異常等異常情況。文章來源地址http://www.zghlxwxcb.cn/news/detail-672504.html

到了這里,關于for循環(huán)內線程池并發(fā)執(zhí)行任務,等到子線程全部處理完任務,主線程在執(zhí)行java的實現方式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 使用 Goroutine 和 Channel 來實現更復雜的并發(fā)模式,如并發(fā)任務執(zhí)行、并發(fā)數據處理,如何做?

    使用 Goroutine 和 Channel 來實現更復雜的并發(fā)模式是 Go 語言的強大特性之一。 下面分別介紹如何實現并發(fā)任務執(zhí)行和并發(fā)數據處理: 并發(fā)任務執(zhí)行: 假設您有一些任務需要并發(fā)地執(zhí)行,您可以使用 Goroutine 來同時執(zhí)行這些任務,然后使用 Channel 來匯總結果。 下面是一個示例,

    2024年01月22日
    瀏覽(25)
  • 并發(fā)編程5:如何執(zhí)行任務?

    目錄 1、線程中執(zhí)行任務的方式 2、Executor 框架 2.1 - 線程的執(zhí)行策略 2.2 - 線程池 2.3 - Executor 的生命周期 2.4 - 延任務與周期任務 3、找出可利用的并行性-代碼示例 3.1 - 單線程的 I/O 操作 3.2 - 攜帶任務結果的 Callable 與 Future(重要) 3.3 - 使用 Future 實現頁面渲染器 3.5 - Completio

    2024年02月11日
    瀏覽(13)
  • qt 線程狀態(tài)機實現并發(fā)自動任務

    一、狀態(tài)機類 頭文件 MyStateMachine.h 狀態(tài)機 cpp

    2024年02月13日
    瀏覽(14)
  • 線程按順序循環(huán)執(zhí)行

    假設有3個線程,依次打印A、B、C,按順序循環(huán)打印100次。 這個其實是線程通信,如果只是按順序執(zhí)行,用只有一個線程的線程池,依次提交線程任務就行,但是這里還不是每個線程只執(zhí)行一次,需要循環(huán)重復打印。 這里有兩種處理方式,一種是搞個全局int變量,對線程數取

    2024年02月04日
    瀏覽(16)
  • 多線程并發(fā)和多任務并行的小結

    一、多線程并行的一點小結 1.無論是thread::spawn還是tokio::spawn,都是創(chuàng)建一個線程或者任務去執(zhí)行閉包的函數體。thread::spawn接受一個閉包作為參數,并返回一個 JoinHandle,其中 T 是閉包的返回類型。創(chuàng)建的新線程將在后臺運行,并執(zhí)行閉包中的代碼。 2.多線程并行:其他的高級

    2024年02月10日
    瀏覽(22)
  • Linux--crontab命令詳解--循環(huán)執(zhí)行的計劃任務

    Linux--crontab命令詳解--循環(huán)執(zhí)行的計劃任務

    循環(huán)執(zhí)行任務是由cron(crond)這個系統(tǒng)服務來控制的。用戶想要建立循環(huán)的計劃任務時,使用的是crontab這個命令,為了避免安全性的問題,和at一樣,我們可以限制使用crontab的賬號,可以使用的配置文件有: /etc/cron.allow 將可以使用crontab的賬號寫入,不在這個文件中的賬戶則不能使用cr

    2024年02月16日
    瀏覽(93)
  • 深入理解高并發(fā)編程 - 線程的執(zhí)行順序

    在Java中,線程的執(zhí)行順序是由操作系統(tǒng)的調度機制決定的,具體順序是不確定的,取決于多個因素,如操作系統(tǒng)的調度策略、線程的優(yōu)先級、線程的狀態(tài)轉換等。因此,不能對線程的執(zhí)行順序做出可靠的假設。 以下是一個簡單的Java代碼示例,演示了多個線程的執(zhí)行順序是不

    2024年02月14日
    瀏覽(24)
  • selenium之顯示等待(等到某個元素出現后再繼續(xù)執(zhí)行)

    本文章還請認真仔細閱讀,非常簡單,閱讀前,你可能已經掌握,xpath 我們在爬蟲的時候,總會利用time.sleep(),去等待元素的出現,但是這很容易出錯,因為你不知道你的網速有多卡??,從而導致頻繁報錯 我相信我的注釋已經很 【言簡意賅】了,你一定可以看得懂 我用了一

    2024年02月12日
    瀏覽(20)
  • 特別有用!Jmeter命令行執(zhí)行時設置并發(fā)數和循環(huán)次數的方法

    特別有用!Jmeter命令行執(zhí)行時設置并發(fā)數和循環(huán)次數的方法

    ? 之前寫過一篇文章介紹如何在centos上部署jmeter來執(zhí)行性能測試,鏈接如下: https://blog.csdn.net/liwenxiang629/article/details/124140833 因為大多數linux服務器都是沒有GUI界面的,這就需要我們通過命令行的方式來運行jmeter腳本,具體如下: jmeter -n -t /opt/jmeter/script/test.jmx -l test2.jtl 參數

    2023年04月10日
    瀏覽(17)
  • 基于Mongodb分布式鎖簡單實現,解決定時任務并發(fā)執(zhí)行問題

    我們日常開發(fā)過程,會有一些定時任務的代碼來統(tǒng)計一些系統(tǒng)運行數據,但是我們應用有需要部署多個實例,傳統(tǒng)的通過配置文件來控制定時任務是否啟動又太過繁瑣,而且還經常出錯,導致一些異常數據的產生 網上有很多分布式鎖的實現方案,基于redis、zk、等有很多,但

    2023年04月18日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包