`
coach
  • 浏览: 386963 次
  • 性别: Icon_minigender_2
  • 来自: 印度
社区版块
存档分类
最新评论

线程池shutdown

阅读更多
写一个程序要求主线程等待子线程运行结束后退出,且子线程同时运行。

思路共享一个计数标志位,每个线程结束后都去更新这个计数标志位,主线程判断该计数标志位是否所有的线程都已经工作完成,但是为了不去浪费过多的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())。



分享到:
评论
2 楼 觞S伤 2014-03-31  
牛人呀·  谢了··
1 楼 gangbener 2011-12-16  
很有用!谢谢牛人~~。^_^

相关推荐

    12-线程池ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf

    线程池shutdown方法主要用于停止线程池接收新任务。具体过程如下: 1. 修改线程池状态为`SHUTDOWN`。 2. 中断所有空闲的worker线程。 3. 清除任务队列中的任务。 ### 六、线程池中线程退出机制源码解析 线程退出...

    java线程池使用后到底要关闭吗

    java线程池使用后到底要关闭吗 java线程池是一种高效的并发编程技术,可以帮助开发者更好地管理线程资源,提高系统的性能和可靠...Shutdown()或shutdownNow()方法可以帮助开发者关闭线程池,避免内存泄露和应用崩溃。

    线程池  

    `ThreadPool`类的构造函数可以初始化线程池,`addTask`方法用于添加任务,`run`方法调度并执行任务,而`shutdown`方法则用于关闭线程池并清理资源。 线程池的使用场景广泛,如在网络I/O、数据库操作、定时任务、...

    线程池管理线程demo

    当不再需要线程池时,应调用`ExecutorService`的`shutdown()`或`shutdownNow()`方法来停止接收新任务并优雅地结束正在执行的任务。`shutdown()`等待所有任务执行完成,而`shutdownNow()`尝试停止正在执行的任务。 ...

    Java实现通用线程池

    ThreadPool类用于管理线程池中的线程,提供了多个方法来管理线程池,例如submit、execute、shutdown等方法。 在使用线程池时,我们需要首先创建一个线程池,然后将任务提交给线程池,线程池会自动选择空闲线程执行...

    linux线程池创建c实现

    * int shutdown:标志线程池是否销毁 * pthread_t *threadid:线程池中的线程 ID 数组 * int max_thread_num:线程池中的最大线程数 * int cur_queue_size:当前等待队列的任务数目 线程池的初始化函数 pool_init()...

    java线程池封装j

    5. **关闭线程池**:提供`shutdown()`或`shutdownNow()`方法,用于优雅地关闭线程池。 ### 4. 线程池优化 线程池的性能优化主要涉及以下方面: - **选择合适的工作队列**:无界队列可能导致资源耗尽,有界队列能...

    java线程池概念.txt

    当线程池处于SHUTDOWN或STOP状态,并且所有工作线程已经销毁,任务缓存队列已经清空或执行结束后,线程池被设置为TERMINATED状态 b:参数再次说明。这是摘自网络的解释,我觉得他比喻的很好,所以这里直接就用它的...

    线程池管理多线程上传

    - **关闭线程池**:调用`shutdown()`或`shutdownNow()`方法,停止接收新任务,正在执行的任务会继续完成,已提交但未执行的任务处理取决于拒绝策略。 3. **多线程上传的应用**: - **文件拆分**:大文件在上传前...

    Python的线程池实现

    `ThreadPoolExecutor`允许我们创建一个线程池对象,通过`submit()`方法提交任务,`shutdown()`方法关闭线程池。线程池内部会维护一个工作线程列表,当有新的任务提交时,线程池会从空闲线程中选择一个执行任务,如果...

    Java/Android线程池演示Demo

    在应用退出或不再需要线程池时,应调用`ExecutorService`的`shutdown()`或`shutdownNow()`方法来停止接收新任务并逐步终止线程池。`shutdown()`会等待所有已提交的任务执行完毕,而`shutdownNow()`则尝试取消正在...

    关闭线程池

    关闭线程池时,调用`executorService.shutdown()`方法,这个方法不会立即停止所有线程,而是拒绝新的任务,并等待现有任务的完成。 `shutdownNow()`方法则更加激进,它会尝试停止所有正在执行的任务,并立即返回一...

    Java线程池使用说明

    最后,通过调用pool.shutdown()方法来关闭线程池,释放相关资源。 通过合理使用Java线程池,开发者可以更加高效地管理线程资源,提高应用程序的性能和稳定性。线程池的使用也应当注意避免资源竞争、线程死锁以及...

    线程池源码解析-多线程

    在实际开发中,结合`ThreadPoolExecutor`的其他方法,如`execute()`、`shutdown()`、`shutdownNow()`等,可以灵活地控制线程池的工作流程,以应对不同的并发场景。总之,掌握线程池源码不仅有助于优化代码,还能在...

    线程池代码

    - 使用`shutdown()`方法优雅地关闭线程池,它会拒绝新任务但允许已提交的任务执行完毕。 - 若要立即停止所有任务,可以调用`shutdownNow()`,它会尝试中断正在执行的任务。 线程池的使用是多线程编程中的高级技巧...

    线程池java

    executor.shutdown(); } } ``` #### 四、如何合理配置线程池的大小 合理配置线程池大小是非常重要的,这直接影响到应用程序的性能。配置线程池时应考虑以下几个因素: 1. **任务特性**:任务的CPU密集型还是IO...

    java 线程池常用方法

    当不再需要线程池时,应通过`ExecutorService`的`shutdown()`方法优雅地关闭线程池。这个方法不会立即终止所有线程,而是不再接受新任务,待当前任务完成后,线程池才会关闭。如果希望立即停止所有任务,可以使用`...

    关于线程池的代码demo

    线程池是多线程编程中的一个重要概念,它在Java中通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类实现。线程池的使用能够有效地管理和控制线程资源,避免频繁创建和销毁线程带来的性能开销,提高...

    JDK自带线程池分析

    pool.shutdown(); } } ``` 固定大小的线程池 固定大小的线程池是指线程池的大小固定不变的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。如果某个线程因为执行异常而结束,那么线程池...

    java线程池实例详细讲解

    5. **生命周期管理**:线程池提供了一些方法来控制其生命周期,如`execute()`用于提交任务,`shutdown()`用于关闭线程池但不立即停止所有正在执行的任务,而`shutdownNow()`则尝试停止所有正在执行的任务并关闭...

Global site tag (gtag.js) - Google Analytics