java线程池优雅关闭

通过一个例子理解线程池优雅关闭的过程

@ToString
public class Task implements Runnable {

    int index;

    public Task(int index) {
        this.index = index;
    }

    @Override
    public void run() {
        System.out.println("开始执行 " + index);
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            System.out.println("任务被中断 " + index);
            return;
        }
        System.out.println("执行完成 " + index);
    }
}
public class ShutdownDemo {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 10; i++) {
            System.out.println("进入循环 " + i);
            if (i == 5) {
                executorService.shutdown();
            }
            try {
                executorService.execute(new Task(i));
            } catch (RejectedExecutionException e) {
                System.out.println("线程池关闭,拒绝执行 " + i);
            }
        }
        try {
            System.out.println("main 等待线程池关闭");
            boolean isStop = executorService.awaitTermination(2, TimeUnit.SECONDS);
            System.out.println("main 第一次等待线程池关闭结果 " + isStop);
            if (!isStop) {
                System.out.println("main 尝试停止正在执行的任务");
                List<Runnable> runnables = executorService.shutdownNow();
                System.out.println("main 等待中的任务已全部移除 " + runnables);
                isStop = executorService.awaitTermination(2, TimeUnit.SECONDS);
                System.out.println("main 第二次等待线程池关闭结果 " + isStop);
                if (!isStop) {
                    System.out.println("线程池终止失败");
                }
            }
        } catch (InterruptedException e) {
            System.out.println("main err " + e.getMessage());
            executorService.shutdownNow();
            Thread.currentThread().interrupt();
        }
    }
}

简单说一下代码:

  1. 创建了2个线程的线程池
  2. 尝试用这个线程池执行10次任务(Task)
  3. 在循环i=5时,关闭线程池,所以i从5到9都会被拒绝执行,执行中和等待中的任务为0-4
  4. main线程中等待2s,因为每个任务要休眠2s,并且线程池只有2个线程,此时应该有任务在等待队列中
  5. main线程中尝试中断线程池中正在执行的任务,并且返回等待中的任务
  6. main线程再次等待2s,再确认线程池是否关闭成功

执行代码,输出如下

进入循环 0
进入循环 1
进入循环 2
进入循环 3
进入循环 4
进入循环 5
开始执行 0
开始执行 1
线程池关闭,拒绝执行 5
进入循环 6
线程池关闭,拒绝执行 6
进入循环 7
线程池关闭,拒绝执行 7
进入循环 8
线程池关闭,拒绝执行 8
进入循环 9
线程池关闭,拒绝执行 9
main 等待线程池关闭
执行完成 1
执行完成 0
开始执行 2
开始执行 3
main 第一次等待线程池关闭结果 false
main 尝试停止正在执行的任务
任务被中断 2
任务被中断 3
main 等待中的任务已全部移除 [Task(index=4)]
main 第二次等待线程池关闭结果 true

参考
jdk17 docs

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java 线程池工厂类是一种构建线程池的工具类,其通过提供线程池配置参数来构造线程池对象。通常来说,线程池工厂类会提供一些静态方法,用于创建不同类型的线程池,如单线程池、固定大小的线程池、可扩展的线程池等。 Java 标准库中提供了 `Executors` 类作为线程池工厂类。例如,你可以使用以下代码创建一个固定大小的线程池: ``` ExecutorService executor = Executors.newFixedThreadPool(5); ``` 这里的 `executor` 就是线程池对象。你也可以使用以下代码创建一个单线程的线程池: ``` ExecutorService executor = Executors.newSingleThreadExecutor(); ``` 另外,Java 还提供了一个 `ThreadPoolExecutor` 类来提供更多细节的线程池定制能力。你可以使用 `ThreadPoolExecutor` 类的构造函数来创建线程池,并通过指定线程池的配置参数来控制线程池的行为。 总的来说,线程池工厂类是一种方便的工具,可以帮助你快速构建线程池,并且提供了多种选择,以满足不同的需求。 ### 回答2: Java线程池工厂类是一个用于创建和管理线程池的类。它提供了一种方便的方式来创建和重用线程,从而实现线程的高效使用。 在Java中,线程池是一种管理和控制线程的机制,它可以将任务提交给线程执行,而不是每次都创建新的线程。这种方式避免了频繁地创建和销毁线程的开销,提高了系统的性能和响应速度。 Java线程池工厂类通过提供一系列静态方法来创建不同类型的线程池,比如FixedThreadPool,CachedThreadPool和ScheduledThreadPool等。这些方法返回一个实现了ExecutorService接口的线程池对象,通过这个对象可以管理线程池的状态和操作。 线程池工厂类的创建线程池的方法通常包含一些参数,比如核心线程数、最大线程数、线程空闲时间、任务队列等,通过这些参数可以灵活地配置线程池以满足具体的业务需求。 线程池工厂类还提供了一些管理线程池的方法,比如提交任务、关闭线程池、获取线程池状态等。通过这些方法可以方便地向线程池提交任务,并且在需要的时候可以优雅关闭线程池。 总之,Java线程池工厂类是一个非常重要的类,它提供了一种简单且高效的方式来管理和重用线程,有助于提高系统的性能和可扩展性。 ### 回答3: Java线程池工厂类是用来创建和管理线程池的类。线程池可以有效地管理线程的创建和销毁,提高程序的效率和性能。 在Java中,可以使用ThreadPoolExecutor类来创建线程池线程池工厂类是为线程池的创建和配置提供便捷方法的工具类。它可以根据需要返回不同类型的线程池,比如固定大小的线程池、缓存线程池或定时任务线程池线程池工厂类提供了一系列的静态方法,可以根据预定义的参数来创建线程池。比如,可以通过指定线程池的最小和最大线程数、线程的空闲时间等参数来创建一个固定大小的线程池。也可以通过设置线程池的最大线程数为无限大,来创建一个缓存线程池。 除了创建线程池线程池工厂类还提供了一些其他的方法,用于执行任务或关闭线程池。可以通过submit()方法将任务提交给线程池执行,也可以通过shutdown()方法关闭线程池,停止所有线程的执行。 总的来说,Java线程池工厂类是一个方便的工具类,可以用于创建和管理线程池。通过使用线程池工厂类,可以避免手动创建和管理线程的繁琐工作,提高程序的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值