ThreadPoolExecutor 的 shutdown() 和shutdownNow()
来源:互联网 发布:苹果手机涂鸦软件 编辑:程序博客网 时间:2024/05/20 18:48
public List<Runnable> shutdownNow() {
List<Runnable> tasks;
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
checkShutdownAccess();
advanceRunState(STOP);
interruptWorkers();
tasks = drainQueue();
} finally {
mainLock.unlock();
}
tryTerminate();
return tasks;
}
public void shutdown() {
final ReentrantLock mainLock = this.mainLock;
mainLock.lock();
try {
checkShutdownAccess();
advanceRunState(SHUTDOWN);
interruptIdleWorkers();
onShutdown(); // hook for ScheduledThreadPoolExecutor
} finally {
mainLock.unlock();
}
tryTerminate();
}
对比其代码可知 shutdown 只是将空闲的线程interrupt() 了, 因此在shutdown()之前提交的任务可以继续执行直到结束。
而shutdownNow 是interrupt所有线程, 因此大部分线程将立刻被中断。之所以是大部分,而不是全部 ,是因为interrupt()方法能力有限。
如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。
例如下面这种情况 将一直打印 go to sleep
package edu.neu.xiaobing.concurrent;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Interrupt {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ExecutorService executor = Executors.newCachedThreadPool();
executor.execute(new Interrupt().new MyRunnable());
executor.shutdownNow();
}
class MyRunnable implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
System.out.println("go to sleep");
// try {
//
// Thread.sleep(100000);
//
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// System.out.println("sleeping");
// }
}
}
}
}
- ThreadPoolExecutor 的 shutdown() 和shutdownNow()
- ThreadPoolExecutor的shutDown和shutDownNow的区别
- threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
- shutdown和shutdownNow--多线程任务的关闭(转)
- shutdown和shutdownNow的区别
- shutdown和shutdownNow--多线程任务的关闭
- ExecutorService对象的shutdown()和shutdownNow()的区别
- ExecutorService对象的shutdown()和shutdownNow()的区别
- ExecutorService对象的shutdown()和shutdownNow()的区别
- java线程池的shutdown和shutdownNow方法的异同
- ExecutorService对象的shutdown()和shutdownNow()的区别
- ExecutorService对象的shutdown()和shutdownNow()的区别
- JAVA线程池shutdown和shutdownNow的区别
- JAVA线程池shutdown和shutdownNow的区别
- JAVA线程池shutdown和shutdownNow的区别
- JAVA线程池shutdown和shutdownNow的区别
- JAVA线程池shutdown和shutdownNow的区别
- JAVA线程池shutdown和shutdownNow的区别
- 软件测试理论知识总结
- 面向对象设计的10个原则
- readline及freadline函数
- sift论文中的一些基本概念
- .NET笔记
- ThreadPoolExecutor 的 shutdown() 和shutdownNow()
- Include,require,include_once,require_once的区别
- PC客户端与Android服务端的Socket同步通信(USB)
- ASIO中async_read_some和async_read有啥分别,分别在什么情况下用
- linux守护进程
- centos安装flashplayer
- hibernate jpa 注解 @Temporal(TemporalType.DATE) 格式化时间日期,页面直接得到格式化类型的值
- understanding linux usb ehci device driver(1)
- RMAN创建duplicate数据库