原文出处:http://blog.chenlb.com/2008/12/main-thread-wait-all-sub-thread-finish-task-in-thread-pool.html
用线程池编写多线程程序时,当所有任务完成时,要做一些统计的工作。而统计工作必须要在所有任务完成才能做。所以要让主线程等待所有任务完成。可以使用ThreadPoolExecutor.awaitTermination(long timeout, TimeUnit unit)。请看示例代码:
- package com.chenlb;
-
- import java.util.Random;
- import java.util.concurrent.LinkedBlockingQueue;
- import java.util.concurrent.ThreadPoolExecutor;
- import java.util.concurrent.TimeUnit;
-
-
-
-
-
-
- public class ThreadPoolUse {
-
- public static class MyTask implements Runnable {
- private static int id = 0;
-
- private String name = "task-"+(++id);
- private int sleep;
-
- public MyTask(int sleep) {
- super();
- this.sleep = sleep;
- }
-
- public void run() {
- System.out.println(name+" -----start-----");
- try {
- Thread.sleep(sleep);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(name+" -----end "+sleep+"-----");
- }
-
- }
-
- public static void main(String[] args) {
- System.out.println("==================start==================");
- ThreadPoolExecutor executor = new ThreadPoolExecutor(5,5, 60, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
- int n = 10;
- int sleep = 10 * 1000;
- Random rm = new Random();
- for(int i=0; i<n; i++) {
- executor.execute(new MyTask(rm.nextInt(sleep)+1));
- }
-
- executor.shutdown();
-
- try {
- boolean loop = true;
- do {
- loop = !executor.awaitTermination(2, TimeUnit.SECONDS);
- } while(loop);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
-
- System.out.println("==================end====================");
- }
-
- }
当然还有其它方法。
分享到:
相关推荐
总的来说,Java提供了丰富的多线程同步机制,可以根据实际需求选择合适的方法来实现“主线程等待所有子线程完成再继续”的功能。在并发编程中,理解并灵活运用这些工具对于提高程序效率和避免死锁等问题至关重要。
"主线程等待子多线程(无结果返回)执行完成再继续执行"这个主题就涉及到如何在Java、C#、Python等编程语言中实现这种同步机制。下面将详细讨论这个知识点。 **1. Java中的`Thread.join()`方法** 在Java中,主线程...
主线程在接收到耗时任务请求后,不会直接处理这个任务,而是将它提交给线程池中的其他线程去执行,主线程则立即返回一个响应给客户端。这样用户就感觉不到任务处理的延迟,提升了用户体验。 2. 线程池...
JAVA 主线程等待子线程执行完毕再执行 JAVA 中的线程控制是非常重要的一部分,而在实际开发中,我们经常会遇到需要主线程等待子线程执行完毕再执行的情况。这种情况下,我们可以使用两种方式来实现:主动式和被动式...
要解决“让主线程等待所有子线程执行完毕”的问题,可以采用以下策略: 1. 使用`join()`方法:如提到的,直接在每个子线程的`start()`之后调用`t.join()`,会导致所有线程按顺序执行。这是因为`join()`会让主线程...
例如,可以创建多个子线程分别负责下载不同的URL,主线程则负责协调各个子线程,确保所有下载任务完成后才结束程序。 在处理大量请求时,为了避免同时发起过多请求导致IP被封禁,可以使用线程池(`...
6. 使用任务监控对象检查或等待所有任务完成:`if (TaskMonitor.IsAllFinish()) {...} else {TaskMonitor.WaitAllFinish();}` 任务对象(TTask)包含了线程和任务数据,平时处于待命状态。当被主线程激活时,任务...
当所有线程都忙碌且任务队列仍有任务时,新提交的任务会等待,直到有线程完成任务并回到池中。 在UI界面中,多线程的应用尤为重要。因为UI更新必须在主线程(也称为GUI线程)中进行,以保证界面的同步性和一致性。...
`Thread.join()`方法允许主线程等待特定线程结束。例如,如果有多个子线程,我们可以在每个子线程执行`join()`,这样主线程会依次等待每个子线程完成。例如: ```java Thread thread1 = new Thread(...); Thread ...
3. **队列最大长度** (`queueCapacity`): 当提交的任务数量超过核心线程数时,超出的任务会被放入等待队列。这里设置为200,意味着当线程数达到核心线程数后,最多还能接受200个任务进入队列。 4. **空闲线程存活...
线程池的主线程将新任务放入队列,工作线程从队列中取出任务进行处理。队列的实现通常需要考虑线程安全,因此可能使用互斥锁来保护队列的操作。 在这个项目中,"thread_pool.c"可能是实现线程池核心功能的源代码,...
- 示例代码展示如何创建线程池实例,提交任务,以及如何在主线程中等待线程池完成所有任务。 通过深入理解并分析提供的“ThreadPool”代码,开发者可以学习到如何在VC6.0环境下实现线程池,以及如何在C++中进行多...
例如,以下代码展示了如何在工作线程中执行任务并等待其完成,同时允许主线程继续处理其他事件: ```cpp QThread workerThread; MyTask task; workerThread.start(); // 将任务移动到工作线程 task.moveToThread(&...
通过合理配置线程池,我们可以有效地控制并发任务的数量,同时避免了主线程被阻塞,保证了应用的流畅运行。此外,通过`ImageHolder`类,我们可以实现更智能的图片加载和管理,如缓存策略、错误处理等。这样的设计...
4. 回收线程:任务完成后,线程不会立即销毁,而是返回线程池等待下一个任务。 C#中使用线程池的API: 1. ThreadPool.QueueUserWorkItem:这是最常用的方法,用于向线程池提交一个工作项。传入一个WaitCallback类型...
4. 主线程使用`TaskCompletionSource.Task`属性进行等待,直到所有任务完成或被取消。 通过这个C#版的线程池端口扫描demo,开发者可以学习到如何有效地管理线程池任务,实现任务的取消以及等待所有任务完成,这对于...
// 阻塞主线程,直到所有工作线程完成 Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } } ``` 在上面的示例中,我们使用`ThreadPool.QueueUserWorkItem`方法向线程池提交了10个任务...
2. CallerRunsPolicy:调用者运行,主线程直接执行被拒绝的任务。 3. DiscardPolicy:丢弃策略,默默丢弃被拒绝的任务,不做任何处理。 4. DiscardOldestPolicy:丢弃最旧的任务,为新任务腾出空间。 五、如何合理...
提供主线程回调功能是为了在线程池中的任务完成后,能在主线程中执行某些操作。这可以通过消息队列、事件驱动或者异步回调等方式实现。例如,可以设置一个全局或静态的回调队列,工作线程在完成任务后将回调函数...
当有新的连接到来时,`newConnection()` 信号会被触发,此时我们需要接受这个连接并将其分配到一个线程中处理,以免阻塞主线程。线程池在此时就起到了关键作用,它可以动态地创建和销毁线程,以适应连接数量的变化。...