问题描述
有如下代码: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 是立即终止