`

主线程等待线程池所有任务完成

    博客分类:
  • Java
 
阅读更多

原文出处:http://blog.chenlb.com/2008/12/main-thread-wait-all-sub-thread-finish-task-in-thread-pool.html

用线程池编写多线程程序时,当所有任务完成时,要做一些统计的工作。而统计工作必须要在所有任务完成才能做。所以要让主线程等待所有任务完成。可以使用ThreadPoolExecutor.awaitTermination(long timeout, TimeUnit unit)。请看示例代码:

  1. package com.chenlb;  
  2.   
  3. import java.util.Random;  
  4. import java.util.concurrent.LinkedBlockingQueue;  
  5. import java.util.concurrent.ThreadPoolExecutor;  
  6. import java.util.concurrent.TimeUnit;  
  7.   
  8. /** 
  9.  * 线程池使用示例, 主线程等待所有任务完成再结束. 
  10.  * 
  11.  * @author chenlb 2008-12-2 上午10:31:03 
  12.  */  
  13. public class ThreadPoolUse {  
  14.   
  15.     public static class MyTask implements Runnable {  
  16.         private static int id = 0;  
  17.   
  18.         private String name = "task-"+(++id);  
  19.         private int sleep;   
  20.   
  21.         public MyTask(int sleep) {  
  22.             super();  
  23.             this.sleep = sleep;  
  24.         }  
  25.   
  26.         public void run() {  
  27.             System.out.println(name+" -----start-----");  
  28.             try {  
  29.                 Thread.sleep(sleep);    //模拟任务执行.  
  30.             } catch (InterruptedException e) {  
  31.                 e.printStackTrace();  
  32.             }  
  33.             System.out.println(name+" -----end "+sleep+"-----");  
  34.         }  
  35.   
  36.     }  
  37.   
  38.     public static void main(String[] args) {  
  39.         System.out.println("==================start==================");  
  40.         ThreadPoolExecutor executor = new ThreadPoolExecutor(5,560, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());  
  41.         int n = 10;  
  42.         int sleep = 10 * 1000;  //10s  
  43.         Random rm = new Random();  
  44.         for(int i=0; i<n; i++) {  
  45.             executor.execute(new MyTask(rm.nextInt(sleep)+1));  
  46.         }  
  47.   
  48.         executor.shutdown();  
  49.   
  50.         try {  
  51.             boolean loop = true;  
  52.             do {    //等待所有任务完成  
  53.                 loop = !executor.awaitTermination(2, TimeUnit.SECONDS);  
  54.             } while(loop);  
  55.         } catch (InterruptedException e) {  
  56.             e.printStackTrace();  
  57.         }  
  58.   
  59.         System.out.println("==================end====================");  
  60.     }  
  61.   
  62. }  

当然还有其它方法。

分享到:
评论

相关推荐

    Java简单实现“主线程等待所有子线程完成再继续”

    总的来说,Java提供了丰富的多线程同步机制,可以根据实际需求选择合适的方法来实现“主线程等待所有子线程完成再继续”的功能。在并发编程中,理解并灵活运用这些工具对于提高程序效率和避免死锁等问题至关重要。

    主线程等待子多线程(无结果返回)执行完成再继续执行

    "主线程等待子多线程(无结果返回)执行完成再继续执行"这个主题就涉及到如何在Java、C#、Python等编程语言中实现这种同步机制。下面将详细讨论这个知识点。 **1. Java中的`Thread.join()`方法** 在Java中,主线程...

    Django异步任务线程池实现原理

    主线程在接收到耗时任务请求后,不会直接处理这个任务,而是将它提交给线程池中的其他线程去执行,主线程则立即返回一个响应给客户端。这样用户就感觉不到任务处理的延迟,提升了用户体验。 2. 线程池...

    JAVA主线程等待子线程执行完毕再执行[参照].pdf

    JAVA 主线程等待子线程执行完毕再执行 JAVA 中的线程控制是非常重要的一部分,而在实际开发中,我们经常会遇到需要主线程等待子线程执行完毕再执行的情况。这种情况下,我们可以使用两种方式来实现:主动式和被动式...

    Java多线程–让主线程等待所有子线程执行完毕

    要解决“让主线程等待所有子线程执行完毕”的问题,可以采用以下策略: 1. 使用`join()`方法:如提到的,直接在每个子线程的`start()`之后调用`t.join()`,会导致所有线程按顺序执行。这是因为`join()`会让主线程...

    python爬虫-08-主线程会等待子线程执行结束再结束.ev4.rar

    例如,可以创建多个子线程分别负责下载不同的URL,主线程则负责协调各个子线程,确保所有下载任务完成后才结束程序。 在处理大量请求时,为了避免同时发起过多请求导致IP被封禁,可以使用线程池(`...

    一种模拟人类思维模式的线程池

    6. 使用任务监控对象检查或等待所有任务完成:`if (TaskMonitor.IsAllFinish()) {...} else {TaskMonitor.WaitAllFinish();}` 任务对象(TTask)包含了线程和任务数据,平时处于待命状态。当被主线程激活时,任务...

    多线程的使用-一个线程池的Demo

    当所有线程都忙碌且任务队列仍有任务时,新提交的任务会等待,直到有线程完成任务并回到池中。 在UI界面中,多线程的应用尤为重要。因为UI更新必须在主线程(也称为GUI线程)中进行,以保证界面的同步性和一致性。...

    Java多线程--等待所有子线程执行完的五种方法.docx

    `Thread.join()`方法允许主线程等待特定线程结束。例如,如果有多个子线程,我们可以在每个子线程执行`join()`,这样主线程会依次等待每个子线程完成。例如: ```java Thread thread1 = new Thread(...); Thread ...

    Spring3.2.6定时任务+线程池.docx

    3. **队列最大长度** (`queueCapacity`): 当提交的任务数量超过核心线程数时,超出的任务会被放入等待队列。这里设置为200,意味着当线程数达到核心线程数后,最多还能接受200个任务进入队列。 4. **空闲线程存活...

    线程池.zip,互斥锁+条件变量+队列,实现线程池,包括线程池的创建,塞任务,和销毁线程池

    线程池的主线程将新任务放入队列,工作线程从队列中取出任务进行处理。队列的实现通常需要考虑线程安全,因此可能使用互斥锁来保护队列的操作。 在这个项目中,"thread_pool.c"可能是实现线程池核心功能的源代码,...

    VC6.0线程池,参考别人代码实现

    - 示例代码展示如何创建线程池实例,提交任务,以及如何在主线程中等待线程池完成所有任务。 通过深入理解并分析提供的“ThreadPool”代码,开发者可以学习到如何在VC6.0环境下实现线程池,以及如何在C++中进行多...

    Qt 之多线程处理多任务

    例如,以下代码展示了如何在工作线程中执行任务并等待其完成,同时允许主线程继续处理其他事件: ```cpp QThread workerThread; MyTask task; workerThread.start(); // 将任务移动到工作线程 task.moveToThread(&...

    用线程池异步加载

    通过合理配置线程池,我们可以有效地控制并发任务的数量,同时避免了主线程被阻塞,保证了应用的流畅运行。此外,通过`ImageHolder`类,我们可以实现更智能的图片加载和管理,如缓存策略、错误处理等。这样的设计...

    C# 线程池使用示例

    4. 回收线程:任务完成后,线程不会立即销毁,而是返回线程池等待下一个任务。 C#中使用线程池的API: 1. ThreadPool.QueueUserWorkItem:这是最常用的方法,用于向线程池提交一个工作项。传入一个WaitCallback类型...

    【线程池扫描端口的demo程序C#版VS2010】可以取消,等待扫描结束

    4. 主线程使用`TaskCompletionSource.Task`属性进行等待,直到所有任务完成或被取消。 通过这个C#版的线程池端口扫描demo,开发者可以学习到如何有效地管理线程池任务,实现任务的取消以及等待所有任务完成,这对于...

    多线程经典简洁例子(线程池)

    // 阻塞主线程,直到所有工作线程完成 Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } } ``` 在上面的示例中,我们使用`ThreadPool.QueueUserWorkItem`方法向线程池提交了10个任务...

    线程池详解:线程池七大核心参数、线程池工作原理、线程池的创建方式、线程池的拒绝策略、如何合理分配线程池大小

    2. CallerRunsPolicy:调用者运行,主线程直接执行被拒绝的任务。 3. DiscardPolicy:丢弃策略,默默丢弃被拒绝的任务,不做任何处理。 4. DiscardOldestPolicy:丢弃最旧的任务,为新任务腾出空间。 五、如何合理...

    做的一个跨平台线程池,求看,求评价,求喷

    提供主线程回调功能是为了在线程池中的任务完成后,能在主线程中执行某些操作。这可以通过消息队列、事件驱动或者异步回调等方式实现。例如,可以设置一个全局或静态的回调队列,工作线程在完成任务后将回调函数...

    QTCPSocket线程池方法

    当有新的连接到来时,`newConnection()` 信号会被触发,此时我们需要接受这个连接并将其分配到一个线程中处理,以免阻塞主线程。线程池在此时就起到了关键作用,它可以动态地创建和销毁线程,以适应连接数量的变化。...

Global site tag (gtag.js) - Google Analytics