Java中的线程池是否一定要shutdown?

乐山ing 发布于 2017/02/13 10:59
阅读 2K+
收藏 1
package testThread;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

class SomeTask implements Runnable{
    
    private volatile boolean stop = false;
    
    public void stop(){
        stop = true;
    }

    @Override
    public void run() {
        while(!stop){
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName()+" interrupted!");
                break;
            }
            System.out.println(Thread.currentThread().getName());
        }
        System.out.println(Thread.currentThread().getName()+" done");
        
    }
    
}


public class ExecutorDynamicStartNewTaskTest {
    

    public static void main(String[] args) {
        
        List<SomeTask> taskList = new ArrayList<>();
        ExecutorService threadPool = Executors.newCachedThreadPool();
        Scanner sc = new Scanner(System.in);
        System.out.println("1.Start new task. 2.Stop first task. 3. stop all thread. 4.quit");
        while(sc.hasNextLine()){
            
            String choice = sc.nextLine();
            if(choice.equals("4")){
                break;
            }
            switch (choice) {
            case "1":
                SomeTask task = new SomeTask();
                taskList.add(task);
                threadPool.execute(task);
                break;
            case "2":
                if(!taskList.isEmpty())
                    taskList.remove(0).stop();
                else
                    System.out.println("No task!");
                break;
            case "3":
                while(!taskList.isEmpty()){
                    taskList.remove(0).stop();
                }
                threadPool.shutdown();//这句是否一定要
                break;
            default:
                break;
            }
            System.out.println("1.Start new task. 2.Stop first task. 3. stop all thread. 4.quit");
        }
        System.out.println(threadPool);
        sc.close();
    }

}

`threadPoolshutdown()`如果不加的话,线程池是否就不能正常关闭?

加载中
0
yysf
yysf
对的,你可以使用传一个ThreadFactory参数进去,将线程设置为守护线程,这样在程序结束时就不需要shutdown
yysf
yysf
shutdown是等队列中所有任务都完成,shutdownNow是立即结束,如果有正在运行的任务,则等到当前任务结束,所以线程池是否销毁还是要看自己提交的任务是否还在运行,但是两者都会调用Thread.Interrupted 自己提交的任务需要判断当前线程是否触发Interrupted然后自己跳出,然后线程结束。
乐山ing
乐山ing
回复 @MStarLight : 查了一些资料,确实应该shutdown或者shutdowNow,要不然会造成内存泄露。
乐山ing
乐山ing
Tomcat启动时生成一个ThreadPool用于全局的线程管理 Tomcat关闭时,不用shutdown也可以吧?因为整个应用都停了
yysf
yysf
嗯,是的
乐山ing
乐山ing
是否指的是将SomeTask所在的线程设置为守护线程?
返回顶部
顶部