老师,您好!
我有一个批跑任务,第一次调用 start() 方法启动任务,当任务跑完后,调用 stop() 方法,正常退出线程池。
当下一次再调用 start() 方法启动任务时,报:
java.util.concurrent.RejectedExecutionException: com.xxx.LoggerService$$Lambda$12/690901601@72f8abb rejected from java.util.concurrent.ThreadPoolExecutor@9e8742e[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 1] 错误位置:ThreadPoolExecutor.java:2047
请问老师,当每次任务运行完毕之后,我想正常退出线程池,也希望下一次运行时,能继续正常运行,该如何做呢?
谢谢老师
下面是 demo:
@Service
public class LoggerService {
// 用于终止日志执行的“毒丸”
final LogMsg poisonPill = new LogMsg(LEVEL.ERROR, "");
// 任务队列
final BlockingQueue<LogMsg> bq = new LinkedBlockingQueue<>();
// 只需要一个线程写日志
ExecutorService es = Executors.newFixedThreadPool(1);
// 启动写日志线程
public void start() {
System.out.println("启动日志服务");
this.es.execute(() -> {
try {
while (true) {
System.out.println("获取日志内容");
LogMsg log = bq.poll(5, TimeUnit.SECONDS);
// 如果是“毒丸”,终止执行
if (poisonPill.equals(log)) {
break;
}
// 省略执行逻辑
}
} catch (Exception e) {
} finally {
}
});
}
// 终止写日志线程
public void stop() {
System.out.println("关闭日志服务");
// 将“毒丸”对象加入阻塞队列
bq.add(poisonPill);
es.shutdown();
}
// 日志级别
enum LEVEL {
INFO, ERROR
}
class LogMsg {
LEVEL level;
String msg;
// 省略构造函数实现
LogMsg(LEVEL lvl, String msg) {
}
// 省略 toString() 实现
}
}
展开
作者回复: 下次运行时重建线程池。你关闭线程池的原因是什么?