1、execute 方法,可以看异常输出在控制台,而 submit 在控制台没有直接输出,必须调用 Future.get() 方法时,可以捕获异常。
2、一个线程出现异常不会影响线程里面其他线程的正常执行。
3、线程不是被回收而是线程池把这个线程移除掉,同时创建一个新的线程放到线程池中。
估计很多人会是以下三点答案(me too):
1.抛异常出来并打印在控制台上
2.其他线程任务不受影响
3.异常线程会被回收
但是这里我先提前说一下以上三点不全对,下面我们来具体分析一下。
话不多说用代码来证明
熟悉Executors线程池(本文线程池都是指Executors)都知道 有两种提交线程的方式execute和submit方式,下面将以这两种提交方式来验证。
贴个代码凑个数
public static void main(String[] args) {
ThreadPoolTaskExecutor executorService = buildThreadPoolTaskExecutor();
executorService.execute(() -> run("execute方法"));
executorService.submit(() -> run("submit方法"));
}
private static void run(String name) {
String printStr = "【thread-name:" + Thread.currentThread().getName() + ",执行方式:" + name+"】";
System.out.println(printStr);
throw new RuntimeException(printStr + ",出现异常");
}
private static ThreadPoolTaskExecutor buildThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor executorService = new ThreadPoolTaskExecutor();
executorService.setThreadNamePrefix("(小罗技术笔记)-");
executorService.setCorePoolSize(5);
executorService.setMaxPoolSize(10);
executorService.setQueueCapacity(100);
executorService.setKeepAliveSeconds(10);
executorService.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executorService.initialize();
return executorService;
}
观看执行结果,诶好奇怪
execute执行方式抛出异常显示在控制台了。