ThreadPoolExecutor 是否需要 shutdown?

问题描述

有如下代码:ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 6, 1, TimeUnit.DAYS, queue);for (int i = 0; i < 10; i++) {executor.execute(new Runnable() {public void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(String.format("thread %d finished", this.hashCode()));}});}executor.shutdown();这个是否需要?如果不需要,这个什么时候会关闭?是否一直会存在,如果我去new 这个class,这个ThreadPoolExecutor 是否会重复创建?

解决方案

shutdown()做了什么按过去执行已提交任务的顺序发起一个有序的关闭,但是不接受新任务。如果已经关闭,则调用没有其他作用。当Executor关闭之后当Executor已经关闭,并且Executor将有限边界用于最大线程和工作队列容量,且已经饱和时,在方法execute()中提交的新任务将被拒绝。shutdown只是将空闲的线程interrupt()了,因此在shutdown()之前提交的任务可以继续执行直到结束。如果不shutdown()池中的线程执行完了之后自然就被销毁了,就跟你不用Executor而自己new一个Thread然后run一样。引用如果我去new 这个class,这个ThreadPoolExecutor 是否会重复创建?这句什么意思?是说new一个ThreadPoolExecutor吗?那当然就是新建了一个线程池了。
解决方案二:
public void shutdown() { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { checkShutdownAccess(); advanceRunState(SHUTDOWN); interruptIdleWorkers(); onShutdown(); // hook for ScheduledThreadPoolExecutor } finally { mainLock.unlock(); } tryTerminate(); }executor.shutdown();这个是否需要?如果不需要,这个什么时候会关闭?是否一直会存在最好注册,如在web环境中使用 注册到web容器销毁 如在spring中使用 注册到容器销毁时如果你不使用了 但你没shutdown 如果里边的线程运行完 也就不存在了shutdown只是给队列的线程发interrupt 不能接受新任务 但等待老任务结束 shutdownNow 是立即终止

时间: 2024-09-25 02:42:27

ThreadPoolExecutor 是否需要 shutdown?的相关文章

ThreadPoolExecutor源码shutdown问题

问题描述 ThreadPoolExecutor源码shutdown问题 上图中的方法是ThreadPoolExecutor中shutdown中执行的中断空闲线程的方法,在此方法中会执行tryLock()方法,在下图中会从队列中获取执行任务,然后获取锁, 使我疑惑的地方是如果任务获取成功但是还没有获取锁的时候,那么interruptIdleWorkers中就会获取到锁,从而认为线程是空闲的,然后发送中断信息,那么此时获取的task岂不就不能执行了?忘大神解答,不胜感激 解决方案 线程池Thread

线程执行者(二)创建一个线程执行者

创建一个线程执行者 使用Executor framework的第一步就是创建一个ThreadPoolExecutor类的对象.你可以使用这个类提供的4个构造器或Executors工厂类来 创建ThreadPoolExecutor.一旦有执行者,你就可以提交Runnable或Callable对象给执行者来执行. 在这个指南中,你将会学习如何使用这两种操作来实现一个web服务器的示例,这个web服务器用来处理各种客户端请求. 准备工作 你应该事先阅读第1章中创建和运行线程的指南,了解Java中线程创

《Java 7并发编程实战手册》第四章线程执行器

感谢人民邮电大学授权并发网发布此书样章,新书购买传送门=>当当网 本章将介绍下列内容: 创建线程执行器 创建固定大小的线程执行器 在执行器中执行任务并返回结果 运行多个任务并处理第一个结果 运行多个任务并处理所有结果 在执行器中延时执行任务 在执行器中周期性执行任务 在执行器中取消任务 在执行器中控制任务的完成 在执行器中分离任务的启动与结果的处理 处理在执行器中被拒绝的任务 4.1 简介 通常,使用Java来开发一个简单的并发应用程序时,会创建一些 Runnable 对象,然后创建对应的 Th

《JAVA多线程编程实战指南》之Two-phase Termination(两阶段终止)模式

本文是<JAVA多线程编程实战指南>的样章,感谢作者授权并发网(ifeve.com)发表此文.感谢demochen整理此文. 5.1Two-phase Termination模式简介 停止线程是一个目标简单而实现却不那么简单的任务.首先,Java没有提供直接的API用于停止线程.此外,停止线程还有一些额外的细节需要考虑,如停止的线程处于阻塞(如等待锁)或者等待状态(等待其他线程),尚有未处理完的任务等. Two-phase Termination模式通过将停止线程这个动作分解为准备阶段和执行阶

Java线程池架构原理和源码解析(ThreadPoolExecutor)

在前面介绍JUC的文章中,提到了关于线程池Execotors的创建介绍,在文章:<java之JUC系列-外部Tools>中第一部分有详细的说明,请参阅: 文章中其实说明了外部的使用方式,但是没有说内部是如何实现的,为了加深对实现的理解,在使用中可以放心,我们这里将做源码解析以及反馈到原理上,Executors工具可以创建普通的线程池以及schedule调度任务的调度池,其实两者实现上还是有一些区别,但是理解了ThreadPoolExecutor,在看ScheduledThreadPoolExe

Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService.利用这两个类,可以创建各种不同的Java线程池,为了方便我们创建线程池,Java API提供了Executors工厂类来帮助我们创建各种各样的线程池.下面我们分别介绍一下这三个类. Java线程池ExecutorService继承树: 一.ThreadPoolExecutor ThreadPoolExecutor是Exe

Java 线程池架构原理和源码解析(ThreadPoolExecutor)

在前面介绍JUC的文章中,提到了关于线程池Execotors的创建介绍,在文章:<java之JUC系列-外部Tools>中第一部分有详细的说明,请参阅: 文章中其实说明了外部的使用方式,但是没有说内部是如何实现的,为了加深对实现的理解,在使用中可以放心,我们这里将做源码解析以及反馈到原理 上,Executors工具可以创建普通的线程池以及schedule调度任务的调度池,其实两者实现上还是有一些区别,但是理解了 ThreadPoolExecutor,在看ScheduledThreadPoolE

java.util.concurrent解析——ThreadPoolExecutor源码解析

任何一种语言.框架,线程都是非常重要的一部分.要想实现异步就需要通过异步线程,但是频繁地创建销毁线程会带来较大的性能开销,而线程池就是为解决这一问题而出现的.简单来说线程池有以下几大优势: 降低资源开销:通过复用已经创建的线程,降低线程频繁创建.销毁带来的资源开销和性能损耗 快速启动任务:通过复用已有线程,快速启动任务 易于管理:线程池可以统一管理.分配.调优和监控 Java中的线程池是基于ThreadPoolExecutor实现的,我们使用的ExecutorService的各种线程池策略都是基

ThreadPoolExecutor源码分析(一):重要成员变量

        ThreadPoolExecutor是一个通过使用可能几个池线程之一来执行每个提交任务的ExecutorService,这些线程池通常通过Executors工厂方法进行配置.         ThreadPoolExecutor中的线程池处理了两个不同的问题:         1.由于减少了每个任务调用的开销,在执行大量的异步任务时它们通常提供改进的性能:         2.它们提供了边界和管理资源的一种手段,包括多线程,在执行任务集合时的消耗.         每个Threa