关闭线程池后,该如何处理后发过来的代码

//安全的终止所有任务

@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("线程池已经被关闭");
    }
}
阅读 2.5k
3 个回答

如果是临时线程池,把 corePoolSize 给 0,keepAliveTime 给小一点就可以了,不需要关闭

别关闭线程池,它没任务了,自然就不会运行了。如过担心资源占用太多,把核心线程设置小点就行了。

一般不用关闭线程池,如果担心线程池造成的资源浪费,可以corePoolSize设置小一点。但是,如果设置为0的话,在没有线程时,线程池会自动关闭。

推荐问题