原文地址:
http://blog.csdn.net/conquer0715/article/details/9000548
利用线程池newFixedThreadPool实现多线程,并通过CountDownLatch实现等待所有子线程结束后执行主线程。
//所有子线程执行完毕后执行主线程
static void threadsCall() {
ExecutorService threadPool = Executors.newFixedThreadPool(10);
int threadTaskNum = 5;
final CountDownLatch answers = new CountDownLatch(threadTaskNum);//同步计数器
for (int i = 0; i < threadTaskNum; i++) {
threadPool.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println("线程" + Thread.currentThread().getName() + " 开始处理任务 ...");
Thread.sleep((long) (Math.random() * 5000));
System.out.println("线程" + Thread.currentThread().getName() + " 处理完毕,汇报结果!");
answers.countDown();
} catch (Exception e) {}
}
});
}
threadPool.shutdown();// 线程池不再接受新任务,全部任务结束后保证线程池退出运行
try {
answers.await();// 在所有子线程结束前保持阻塞
} catch (InterruptedException e) {}
System.out.println("线程" + Thread.currentThread().getName() + "已收到所有汇报结果");
}
结果:
线程pool-1-thread-1 开始处理任务 ...
线程pool-1-thread-2 开始处理任务 ...
线程pool-1-thread-3 开始处理任务 ...
线程pool-1-thread-4 开始处理任务 ...
线程pool-1-thread-5 开始处理任务 ...
线程pool-1-thread-5 处理完毕,汇报结果!
线程pool-1-thread-2 处理完毕,汇报结果!
线程pool-1-thread-3 处理完毕,汇报结果!
线程pool-1-thread-1 处理完毕,汇报结果!
线程pool-1-thread-4 处理完毕,汇报结果!
线程main已收到所有汇报结果
分享到:
相关推荐
在Java多线程编程中,有时我们需要确保所有子线程执行完毕后再进行后续操作,例如在并发测试、数据聚合或资源清理等场景。本篇文章将详细介绍五种在Java中等待所有子线程执行完的方法。 ### 方法一:使用`sleep`...
Java中,我们通常使用`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool(int nThreads)`创建固定大小的线程池,`newSingleThreadExecutor()`创建只有一个线程的线程池,`newCachedThreadPool()`...
- **创建线程池**:通过`ExecutorService`接口实例化,如`Executors`类提供的`newFixedThreadPool`、`newCachedThreadPool`等静态方法。 - **提交任务**:使用`ExecutorService`的`execute()`方法提交`Runnable`或...
Java的`java.util.concurrent`包提供了四种主要的线程池实现:`Executors.newFixedThreadPool()`, `Executors.newSingleThreadExecutor()`, `Executors.newCachedThreadPool()`以及`Executors.newWorkStealingPool()...
- 使用`Executors`工厂类创建线程池,如`newFixedThreadPool`创建固定大小的线程池,`newCachedThreadPool`创建缓存线程池等。 - 提交任务到线程池,通过`ExecutorService`的`execute`方法将`Runnable`或`Callable...
线程池是Java多线程编程中...线程池的扩展类`Executors`提供了一些预定义的线程池实现,如单线程池(newSingleThreadExecutor)、定长线程池(newFixedThreadPool)、缓存线程池(newCachedThreadPool)和定时线程池...
4. **创建线程池**:使用`Executors`类的静态方法创建线程池,例如 `newFixedThreadPool(int nThreads)` 创建一个固定大小的线程池,其中线程数量是可预设的。 5. **使用线程池**: - **创建线程池对象**:如 `...
2. newFixedThreadPool(int nThreads):创建一个固定大小的线程池,池中维护着指定数量的工作线程,一旦工作线程因执行任务结束,将立即补充新的工作线程。 3. newCachedThreadPool():创建一个可缓存的线程池,...
在Java中,我们可以使用`Executors`工厂类创建线程池,如`newFixedThreadPool`用于创建固定大小的线程池,`newSingleThreadExecutor`创建只有一个线程的线程池,`newCachedThreadPool`创建可缓存的线程池,等等。...
在Android中,通常推荐使用`Executors`静态工厂方法来创建线程池,如`newFixedThreadPool`用于创建固定大小的线程池,`newCachedThreadPool`用于创建缓存线程池等。然而,直接使用这些预定义的线程池可能无法满足...
- 使用`Executors`静态工厂方法创建线程池,如`newFixedThreadPool`(固定大小线程池)、`newSingleThreadExecutor`(单线程线程池)和`newWorkStealingPool`(并行流支持的线程池)等。 - 提交任务给线程池,可以...
ExecutorService pool = Executors.newFixedThreadPool(5); for (int i = 0; i ; i++) { pool.submit(new MyThread()); } pool.shutdown(); } } ``` 固定大小的线程池 固定大小的线程池是指线程池的大小固定...
- `newFixedThreadPool(int nThreads)`:创建固定大小的线程池,线程数量始终保持不变,超出的任务进入队列等待。 - `newSingleThreadExecutor()`:创建单线程的线程池,所有任务在线程池中串行执行。 示例: `...
3. newFixedThreadPool:创建一个固定大小的线程池,线程数量保持不变,任务排队等待执行。 4. newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。 5. ForkJoinPool:用于执行Fork/Join框架的...
例如,`newFixedThreadPool(int n)` 创建固定大小的线程池,`newSingleThreadExecutor()` 创建只有一个线程的线程池,`newCachedThreadPool()` 创建可缓存线程的线程池。 线程池的工作流程大致如下: 1. 当一个...
- **newFixedThreadPool**:创建固定大小的线程池。适用于需要保持固定数量的线程处理任务的场景。 - **newCachedThreadPool**:创建一个可根据需要创建新线程的线程池。适用于处理大量短暂的异步任务,线程池会根据...
例如,创建一个固定大小的线程池可以使用`Executors.newFixedThreadPool(int nThreads)`,而创建一个按需增长的线程池可以使用`Executors.newCachedThreadPool()`。 线程池的配置需要根据实际应用的需求进行,包括...
2. **FixedThreadPool**: `Executors.newFixedThreadPool(nThreads)`创建一个固定大小的线程池,它维护的线程数量始终保持不变。当一个新任务提交而所有线程都在工作时,任务会被添加到队列中等待。这种线程池适合...
ThreadPoolManager:Executors.newFixedThreadPool(num * 2);// 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程 threadPool: 线程池 创建线程池,销毁线程池,添加新任务
- `newFixedThreadPool`:固定大小的线程池,适合执行大量重复性任务。 - `newSingleThreadExecutor`:只有一个线程的线程池,确保任务按顺序执行。 - `newCachedThreadPool`:可缓存的线程池,会根据需要创建新...