写一个程序要求主线程等待子线程运行结束后退出,且子线程同时运行。
思路共享一个计数标志位,每个线程结束后都去更新这个计数标志位,主线程判断该计数标志位是否所有的线程都已经工作完成,但是为了不去浪费过多的CPU,主线程需要进行Thread.sleep(),但是Thread.sleep()也会倒是效率的下降,所以这样的方法并不完美。
查资料,发现java.util.concurrent包中有个名为Executors的类,可以创建线程池,于是仔细研究了一下,发现使用这个类构造一个线程池,可以很简单的解决这个问题。
package base;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main
{
private static final int NTHREDS = 10;
public static void main(String[] args)
{
ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
for (int i = 0; i < NTHREDS; i++)
{
Runnable worker = new MyRunnable();
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated())
{
}
System.out.println("Finished all threads");
}
}
package base;
public class MyRunnable implements Runnable
{
public void run()
{
System.out.println(Thread.currentThread().getName());
}
}
通过不断运行ExecutorService.isTerminated()方法检测全部的线程是否都已经运行结束,ExecutorService.shutdown()将使之前通过Executor.execute()提交的任务运行结束后关闭线程池。ExecutorService还提供了一个与ExecutorService.shutdown()对应的方法名为ExecutorService.shutdownNow()该方法试图将结束已经提交的任务并结束线程池(只有调用了interrupt才起作用,亦即任务体run的代码中有sleep())。
分享到:
相关推荐
线程池shutdown方法主要用于停止线程池接收新任务。具体过程如下: 1. 修改线程池状态为`SHUTDOWN`。 2. 中断所有空闲的worker线程。 3. 清除任务队列中的任务。 ### 六、线程池中线程退出机制源码解析 线程退出...
java线程池使用后到底要关闭吗 java线程池是一种高效的并发编程技术,可以帮助开发者更好地管理线程资源,提高系统的性能和可靠...Shutdown()或shutdownNow()方法可以帮助开发者关闭线程池,避免内存泄露和应用崩溃。
`ThreadPool`类的构造函数可以初始化线程池,`addTask`方法用于添加任务,`run`方法调度并执行任务,而`shutdown`方法则用于关闭线程池并清理资源。 线程池的使用场景广泛,如在网络I/O、数据库操作、定时任务、...
当不再需要线程池时,应调用`ExecutorService`的`shutdown()`或`shutdownNow()`方法来停止接收新任务并优雅地结束正在执行的任务。`shutdown()`等待所有任务执行完成,而`shutdownNow()`尝试停止正在执行的任务。 ...
ThreadPool类用于管理线程池中的线程,提供了多个方法来管理线程池,例如submit、execute、shutdown等方法。 在使用线程池时,我们需要首先创建一个线程池,然后将任务提交给线程池,线程池会自动选择空闲线程执行...
* int shutdown:标志线程池是否销毁 * pthread_t *threadid:线程池中的线程 ID 数组 * int max_thread_num:线程池中的最大线程数 * int cur_queue_size:当前等待队列的任务数目 线程池的初始化函数 pool_init()...
5. **关闭线程池**:提供`shutdown()`或`shutdownNow()`方法,用于优雅地关闭线程池。 ### 4. 线程池优化 线程池的性能优化主要涉及以下方面: - **选择合适的工作队列**:无界队列可能导致资源耗尽,有界队列能...
当线程池处于SHUTDOWN或STOP状态,并且所有工作线程已经销毁,任务缓存队列已经清空或执行结束后,线程池被设置为TERMINATED状态 b:参数再次说明。这是摘自网络的解释,我觉得他比喻的很好,所以这里直接就用它的...
- **关闭线程池**:调用`shutdown()`或`shutdownNow()`方法,停止接收新任务,正在执行的任务会继续完成,已提交但未执行的任务处理取决于拒绝策略。 3. **多线程上传的应用**: - **文件拆分**:大文件在上传前...
`ThreadPoolExecutor`允许我们创建一个线程池对象,通过`submit()`方法提交任务,`shutdown()`方法关闭线程池。线程池内部会维护一个工作线程列表,当有新的任务提交时,线程池会从空闲线程中选择一个执行任务,如果...
在应用退出或不再需要线程池时,应调用`ExecutorService`的`shutdown()`或`shutdownNow()`方法来停止接收新任务并逐步终止线程池。`shutdown()`会等待所有已提交的任务执行完毕,而`shutdownNow()`则尝试取消正在...
关闭线程池时,调用`executorService.shutdown()`方法,这个方法不会立即停止所有线程,而是拒绝新的任务,并等待现有任务的完成。 `shutdownNow()`方法则更加激进,它会尝试停止所有正在执行的任务,并立即返回一...
最后,通过调用pool.shutdown()方法来关闭线程池,释放相关资源。 通过合理使用Java线程池,开发者可以更加高效地管理线程资源,提高应用程序的性能和稳定性。线程池的使用也应当注意避免资源竞争、线程死锁以及...
在实际开发中,结合`ThreadPoolExecutor`的其他方法,如`execute()`、`shutdown()`、`shutdownNow()`等,可以灵活地控制线程池的工作流程,以应对不同的并发场景。总之,掌握线程池源码不仅有助于优化代码,还能在...
- 使用`shutdown()`方法优雅地关闭线程池,它会拒绝新任务但允许已提交的任务执行完毕。 - 若要立即停止所有任务,可以调用`shutdownNow()`,它会尝试中断正在执行的任务。 线程池的使用是多线程编程中的高级技巧...
executor.shutdown(); } } ``` #### 四、如何合理配置线程池的大小 合理配置线程池大小是非常重要的,这直接影响到应用程序的性能。配置线程池时应考虑以下几个因素: 1. **任务特性**:任务的CPU密集型还是IO...
当不再需要线程池时,应通过`ExecutorService`的`shutdown()`方法优雅地关闭线程池。这个方法不会立即终止所有线程,而是不再接受新任务,待当前任务完成后,线程池才会关闭。如果希望立即停止所有任务,可以使用`...
线程池是多线程编程中的一个重要概念,它在Java中通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类实现。线程池的使用能够有效地管理和控制线程资源,避免频繁创建和销毁线程带来的性能开销,提高...
pool.shutdown(); } } ``` 固定大小的线程池 固定大小的线程池是指线程池的大小固定不变的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。如果某个线程因为执行异常而结束,那么线程池...
5. **生命周期管理**:线程池提供了一些方法来控制其生命周期,如`execute()`用于提交任务,`shutdown()`用于关闭线程池但不立即停止所有正在执行的任务,而`shutdownNow()`则尝试停止所有正在执行的任务并关闭...