关闭线程池后,该如何处理后发过来的代码
//安全的终止所有任务
@RequestMapping("/stop")
public void stop(HttpServletRequest request,HttpServletResponse response) throws InterruptedException {
System.out.println("更换产品操作开始");
try {
exec.shutdown();
Thread.sleep(20);//增加延迟
synchronized (waitLock){
if(i == 0){
//用轮询的方式判断线程池是不是被关闭
while (exec.isTerminated()){
System.out.println("开始处理IO等其他耗时工作");
//线程开启长耗时工作
caozuo(s);
i=1;
break;
}
}
}
}catch (Exception e){
e.printStackTrace();
}finally {
//其他代码
}
}
我已经用上段代码安全(数据不丢失)的关闭了线程池了,表示我当前的任务结束了;但是我后续还想接收数据,有么有其他思路能够解决,后续代码接收的问题呢谢谢??(我查了其他资料说是,关闭线程池之后无法在重启该线程池了)
//之后要上传数据的代码
@RequestMapping("/produce")
public void produce(HttpServletRequest request, HttpServletResponse response, KaiFaBan kaiFaBan){
//判断线程池是不是关闭
if(!exec.isShutdown()){
//线程池没有被关闭
exec.execute(new Runnable() {
@Override
public void run() {
try {
if(kaiFaBan != null){
queue.put(kaiFaBan);//阻塞
System.out.println("《生产者》把消息已存入队列中");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}else{
System.out.println("线程池已经被关闭");
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果是临时线程池,把 corePoolSize 给 0,keepAliveTime 给小一点就可以了,不需要关闭
别关闭线程池,它没任务了,自然就不会运行了。如过担心资源占用太多,把核心线程设置小点就行了。
一般不用关闭线程池,如果担心线程池造成的资源浪费,可以corePoolSize设置小一点。但是,如果设置为0的话,在没有线程时,线程池会自动关闭。