黑马程序员技术交流社区

标题: 关于关闭线程池的问题,求解? [打印本页]

作者: 悟中生有    时间: 2014-1-13 13:37
标题: 关于关闭线程池的问题,求解?
本帖最后由 悟中生有 于 2014-1-13 16:25 编辑

关闭线程池的方法有shutdown(所有线程执行完成后关闭)与shutdownNow(立即关闭)两种,可是这两个分别应该在什么时候用呢?老是搞不清楚,请大神指教一下,多谢啦!

作者: xu6148152    时间: 2014-1-13 13:59
本帖最后由 xu6148152 于 2014-1-13 14:08 编辑

shutDown()

    当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
  1. public void shutdown()
  2. {  
  3.      SecurityManager security = System.getSecurityManager();  
  4.     if (security != null)  
  5.             security.checkPermission(shutdownPerm);  
  6.         final ReentrantLock mainLock = this.mainLock;  
  7.         mainLock.lock();  
  8.         try {  
  9.             if (security != null) { // Check if caller can modify our threads  
  10.                 for (Worker w : workers)  
  11.                     security.checkAccess(w.thread);  
  12.             }  
  13.             int state = runState;  
  14.             if (state < SHUTDOWN)  
  15.                 //设置线程池状态为关闭状态  
  16.                 runState = SHUTDOWN;     //----------------代码1  
  17.             try {  
  18.                 for (Worker w : workers) {  
  19.                     //一个一个中断线程  
  20.                     w.interruptIfIdle();  //-----------------代码2  
  21.                 }  
  22.             } catch (SecurityException se) { // Try to back out  
  23.                 runState = state;  
  24.                 // tryTerminate() here would be a no-op  
  25.                 throw se;  
  26.             }  
  27.             tryTerminate(); // Terminate now if pool and queue empty  
  28.         } finally {  
  29.             mainLock.unlock();  
  30.         }  
  31. }  
复制代码



shutdownNow()

     根据JDK文档描述,大致意思是:执行该方法,线程池的状态立刻变成STOP状态,并试图停止所有正在执行的线程,不再处理还在池队列中等待的任务,当然,它会返回那些未执行的任务。
     它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的,但是大家知道,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。
  1. public List<Runnable> shutdownNow()
  2. {  
  3.        /*
  4.         * shutdownNow differs from shutdown only in that
  5.         * 1. runState is set to STOP,
  6.         * 2. all worker threads are interrupted, not just the idle ones, and
  7.         * 3. the queue is drained and returned.
  8.         */  
  9. SecurityManager security = System.getSecurityManager();  
  10. if (security != null)  
  11.            security.checkPermission(shutdownPerm);  
  12.   
  13.        final ReentrantLock mainLock = this.mainLock;  
  14.        mainLock.lock();  
  15.        try {  
  16.            if (security != null) { // Check if caller can modify our threads  
  17.                for (Worker w : workers)  
  18.                    security.checkAccess(w.thread);  
  19.            }  
  20.   
  21.            int state = runState;  
  22.            if (state < STOP)  
  23.                runState = STOP;  
  24.   
  25.            try {  
  26.                for (Worker w : workers) {  
  27.                    w.interruptNow();  
  28.                }  
  29.            } catch (SecurityException se) { // Try to back out  
  30.                runState = state;  
  31.                // tryTerminate() here would be a no-op  
  32.                throw se;  
  33.            }  
  34.   
  35.            List<Runnable> tasks = drainQueue();  
  36.            tryTerminate(); // Terminate now if pool and queue empty  
  37.            return tasks;  
  38.        } finally {  
  39.            mainLock.unlock();  
  40.        }  
  41. }  
复制代码




作者: 午夜b'Boy    时间: 2014-1-13 15:35
xu6148152 发表于 2014-1-13 13:59
shutDown()

    当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添 ...

这知识点是哪里学的,有视频不?
作者: xu6148152    时间: 2014-1-13 15:47
午夜b'Boy 发表于 2014-1-13 15:35
这知识点是哪里学的,有视频不?

视频不可能学到所有的东西。多看看书。
作者: 午夜b'Boy    时间: 2014-1-13 15:54
xu6148152 发表于 2014-1-13 15:47
视频不可能学到所有的东西。多看看书。

我都是跟着视频学的,java那么博大精深,真不知从何学起




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2