架构师

您现在的位置是:首页 > 技术博客 > 编程基础

编程基础

线程池创建多个线程,如果其中一个线程抛异常会怎样?

架构师小跟班 2020-07-09 编程基础
背景:创建一个线程池,允许同时执行5个线程。模拟100个任务(for循环100次),当i=3时抛出异常。代码:package com.provy.jiagou;import cn.hutool.core.thread.ThreadUtil;import jav

背景

创建一个线程池,允许同时执行5个线程。模拟100个任务(for循环100次),当i=3时抛出异常。

代码:

package com.provy.jiagou;

import cn.hutool.core.thread.ThreadUtil;

import java.util.concurrent.ExecutorService;

/**
 * @author 架构师小跟班
 * @Description: https://www.jiagou1216.com
 * @date 2020/7/9 10:14
 */
public class Test {
    /**
     * 初始化线程池
     */
    private static ExecutorService executor = ThreadUtil.newExecutor(5);

    public static void main(String[] args) {


        for (int i = 1; i <= 100; i++) {
            int index = i;
            executor.execute(() -> threadHandler(index));
        }
        executor.shutdown();
    }

    private static void threadHandler(int index) {
        System.out.println(Thread.currentThread().getName() + "[" + index + "]");
        if (3 == index) {
            throw new NullPointerException();
        }
        ThreadUtil.sleep(3000);
    }
}

打印:

pool-1-thread-5[5]

pool-1-thread-3[3]

pool-1-thread-4[4]

pool-1-thread-2[2]

pool-1-thread-1[1]

pool-1-thread-6[6]

Exception in thread "pool-1-thread-3" java.lang.NullPointerException

at com.provy.jiagou.Test.threadHandler(Test.java:32)

at com.provy.jiagou.Test.lambda$main$0(Test.java:24)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:748)

pool-1-thread-2[7]

pool-1-thread-1[8]

pool-1-thread-5[11]

pool-1-thread-6[9]

pool-1-thread-4[10]

pool-1-thread-5[12]

pool-1-thread-2[13]

pool-1-thread-6[15]

pool-1-thread-4[14]

pool-1-thread-1[16]

……

Process finished with exit code -1

结论:

从控制台打印信息来看,线程执行每5个一组,第3个线程执行后抛出空指针异常,该线程被放弃,线程池立即创建了线程6(pool-1-thread-6),后面的任务都由线程6来执行,线程3再没有出现过。

所以,当线程池中的线程执行过程中出现异常时,线程池会创建新的线程取代之,线程池中的线程始终保持设定的个数。


文章评论