在一個主線程中,要求有大量子線程執行完之後,主線程才執行完成?多種方式,考慮效率。

来源:https://www.cnblogs.com/HuiH/archive/2020/04/19/12733909.html
-Advertisement-
Play Games

1、在主函數中使用join()方法。 t1.start(); t2.start(); t3.start(); t1.join();//不會導致t1和t2和t3的順序執行 t2.join(); t3.join(); System.out.println("Main finished"); 2、Coun ...


1、在主函數中使用join()方法

    t1.start();
    t2.start();
    t3.start();

    t1.join();//不會導致t1和t2和t3的順序執行
    t2.join();
    t3.join();
System.out.println("Main finished");

 

2、CountDownLatch,一個同步輔助類,在完成一組正在其他線程中執行的操作之前,它允許一個或多個線程一直等待。

public class WithLatch{
    public static void main(String[] args){
        CountDownLatch latch = new CountDownLatch(3);
        for(int i=0;i<3;i++){
            new ChildThread(i,latch).start();
        }
        try{
            latch.await();
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("Main finished");
    }
    static calss ChildThread extends Thread{
        private int id = -1;
        private CountDownLatch latch = null;

        public ChildThread(int id, CountDownLatch latch){
            this.id = id;
            this.latch = latch;
        }
        public void run(){
            try{
                Thread.sleep(Math.abs(new Random().nextInt(5000)));
                System.out.println(String.format("Child Thread %d finished",id));
            }catch(InterruptedExcepion e){
                e.printStackTrace();
            }finally{
                latch.countDown();
            }
        }
    }
}

 

3、使用線程池

public class WithExecutor{
    public static void main(String[] args) throws InterruptedExcepion{
        ExecutorService pool = Executors.newFixedThreadPool(3);
        List<Callable<Void>> list = new ArrayList<Callable<Void>>();
        for(int i=0;i<3;i++){
            list.add(new ChildThread(i));
        }
        try{
            pool.invokeAll(list);
        }finally{
            pool.shutdown();
        }
        System.out.println("Main finished");
    }

    static class ChildThread implements Callable<Void>{
        private int id =  -1;
    
        public ChildThread (int id){
            this.id = id;
        }
        public Void call() throws Exception{
            try{
                Thread.sleep(Math.abs(new Random().nextInt(5000)));
                System.out.println(String.format("Child Thread %d finished",id));
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            return null;
        }
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 判斷input上傳文件類型,文件大小。input獲取的size為位元組,判斷大小的時候需要把限制大小轉換為位元組 ...
  • 前情提要: 現有一個網站框架,包括主體項目WebApp一個,包含 IIdentityUser 介面的基架項目 A。用於處理用戶身份驗證的服務 AuthenticationService 位於命名空間B。用於保存數據的實體 User : IIdentityUser 位置項目C。項目之間的關係是B和C依 ...
  • 1 簡介 是最簡單的使用 的方式,而 是最流行的 資料庫。兩者在分散式、微服務架構中使用率極高,本文將用實例介紹如何在 中整合 的兩種方法: 和`MongoTemplate`。 代碼結構如下: 2 項目準備 2.1 啟動MongoDB實例 為了方便,使用 來啟動 ,詳細指導文檔請參考: "用Dock ...
  • 知識無界 記錄tomcat和mybatis源碼導入到eclipse的過程 開發這麼久了,不能老crud,看看人家的源碼和設計思路。 0. tomcat源碼導入eclipse 下載tomcat源碼https://github.com/apache/tomcat, 然後按步驟下載(也可用git clon ...
  • springboot 項目使用阿裡雲簡訊服務發送手機驗證碼 (第一篇) 1、註冊阿裡雲賬戶進行賬號實名認證 2、申請簡訊簽名和模板 3、創建access_key和access_secret 4、然後就是代碼編寫 一、找到產品與服務裡面的雲通信模塊,然後找到簡訊服務,開通簡訊服務。我這裡已經開通,可直 ...
  • Python變數和數據類型 數據類型 print語句 註釋 Python的註釋以 # 開頭,後面的文字直到行尾都算註釋 # 這一行全部都是註釋... print 'hello' # 這也是註釋 這裡要註意註意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020 ...
  • 頁面寫死el-select下拉框標簽: 通過v-for="item in stateArr"綁定,stateArr聲明在Vue組件裡面的data參數裡面代碼如下: <el-form class="small-space" :model="createdItem" label-position="le ...
  • 在C++11中, 不再只有邏輯與的含義,還可能是右值引用: 但也不盡然, 還可能是轉發引用: “轉發引用”(forwarding reference)舊稱“通用引用”(universal reference),它的“通用”之處在於你可以拿一個左值綁定給轉發引用,但不能給右值引用: 一個函數的參數要想 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...