面试题
曾经遇到过一次面试的时候问过:既然new Thread()和newSingleThreadExecutor()都是创建一个线程处理,为什么还需要存在单个线程的线程池呢?
案例演示分析
同样是10个任务需要处理,通过new Thread()和newSingleThreadExecutor()演示下
new Thread()方式
public static void main(String[] args) {
for (int i = 1; i <=10; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName()+" 办理业务");
}).start();
}
}
控制台输出
每次都是新建一个线程去处理
newSingleThreadExecutor()方式
public static void main(String[] args) {
//一池一线程
//一个窗口
ExecutorService threadPool = Executors.newSingleThreadExecutor();
//一池可扩容线程
ExecutorService threadPool = Executors.newCachedThreadPool();
//10个顾客请求
try {
for (int i = 1; i <=10; i++) {
//执行
threadPool.execute(()->{
System.out.println(Thread.currentThread().getName()+" 办理业务");
});
}
}catch (Exception e) {
e.printStackTrace();
}finally {
//关闭
threadPool.shutdown();
}
}
控制台打印
由线程里面的一个线程来处理
总结
new Thead()的方式每次都会新建一个线程来处理,增加消耗;
newSingleThreadExecutor()的方式只使用同一个线程来处理,减少了消耗;