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;
    }

Untitled

观看执行结果,诶好奇怪

execute执行方式抛出异常显示在控制台了。