shutdown和shutdownNow--多线程任务的关闭(转)
来源:互联网 发布:软件自动化测试招聘 编辑:程序博客网 时间:2024/06/11 01:44
采用5.0的线程池关闭线程,不管怎样,最后都是调用Interrupt.而interrupt这个方法,并不是什么情况下都能结束线程,释放资源。Interrupt只是在线程阻塞的时候,抛个异常出来,从而结束这个阻塞。
比如像下面的这种代码,就不管怎么shutdown,或者是shutdownNow,都不会关闭:
- while(true){
- try {
- System.out.println("beat"); TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
因此,我们使用线程池的时候,不仅需要知道怎么开启,更需要知道怎么关闭,下面的比较好的写法:
- while(!Thread.interrupted()){
- try {
- System.out.println("beat");
- TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- //终结循环
- Thread.currentThread().interrupt();
- }
- }
最后需要调用 executorService.shutdown(); 或者showdownNow()来终止这个任务。
这里有几点需要注意:
1. Thread.interrupted() 是一个测试线程是否已经被调用了interrupt的方法,因为如果已
经被调用的话,线程下次wait的时候,就会很粗暴的抛出一个异常来,Thread.interrupted()返回一个boolean,表示是否存在这种情形,不仅如此,它还会把已经调用的一个interrupt给清掉。(只能清掉一个)
2. shutdown方法: 这个方法,只能立刻interrupt那些目前没有任务,处于等待状态从blockingQueue获取任务的异常。而不能interrupt那些在任务执行过程中的thread,或者是任务执行过程中挂起的thread. 看一下实现代码就知道原因:
- void interruptIfIdle() {
- final ReentrantLock runLock = this.runLock;
- if ([b]runLock.tryLock()[/b]) {
- try {
- thread.interrupt();
- } finally {
- runLock.unlock();
- }
- }
- }
执行过程中的worker有锁,没有执行完任务,这个锁是不会释放的。
3. shutdownNow方法: 不管任务是否在执行中,一律interrupt,不去判断什么锁不锁。
- void interruptNow() {
- thread.interrupt();
- }
- shutdown和shutdownNow--多线程任务的关闭(转)
- shutdown和shutdownNow--多线程任务的关闭
- ThreadPoolExecutor 的 shutdown() 和shutdownNow()
- shutdown和shutdownNow的区别
- ThreadPoolExecutor的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的区别
- threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
- JAVA线程池shutdown和shutdownNow的区别
- FFilmation 手册(1)
- 用谷歌拼音输入法
- secureCRT tips
- oracle基础语法(一)
- ActionScript3.0数据绑定
- shutdown和shutdownNow--多线程任务的关闭(转)
- Objective-C内存管理~~
- seo快速提高网站排名
- Question From QA/TEST Team
- 网站优化seo贵在坚持
- 额外域控变更ip地址
- 检查字符串是否是整数
- 兔年2011新年快乐
- 通用的方法获取枚举内各值的描述