2022-03-31 线程池的shutdown方法

生产环境某定时器用了线程池,经常出现问题,定时器执行到线程池的代码处就关闭了,异常如下:

java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@42297063 rejected from java.util.concurrent.ThreadPoolExecutor@62d0ce42[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 24408]
        at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
        at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
        at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
        at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
......

原因是在这里线程池定义为类的属性,在方法中调用线程池并调用了shutdown()方法,然而这种情况的线程池是不能关闭的,因为方法关掉了类变量的线程池,会让下一次方法的执行没有线程池可用,这时只能重启,重启之后的第一次运行正常,产生了新的类变量线程池,而方法中关闭了线程池,导致后面的运行没线程池可用,报异常。
还有一种方法,在方法中定义线程池,调用线程池之后调用shutdown()方法。所以2种方式:
1,把线程池定义为类的变量,不调用shutdown()方法;
2,把线程池定义为方法的变量,要调用shutdown()方法

你可能感兴趣的:(2022-03-31 线程池的shutdown方法)