教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

线程池中多余的线程是如何回收的?

更新时间:2023年11月01日10时33分 来源:传智教育 浏览次数:

好口碑IT培训

  在Java中,线程池中多余的线程回收是通过线程池的实现来管理的。Java提供了java.util.concurrent包,其中包含了线程池的各种实现,如ThreadPoolExecutor。线程池的回收策略通常分为两种:

  1.核心线程池回收策略:

  核心线程通常保持活动状态,但在某些条件下,也可以被回收。

  2.非核心线程池回收策略:

  非核心线程通常是临时创建的,当它们闲置一段时间后,可以被回收。

线程池中多余线程如何回收

  接下来我们看一段具体的代码示例,演示了如何创建一个线程池并设置线程回收策略:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 创建一个线程池,包含2个核心线程和最多4个线程
        ExecutorService threadPool = Executors.newFixedThreadPool(2);

        // 提交一些任务
        for (int i = 0; i < 5; i++) {
            final int taskNumber = i;
            threadPool.execute(() -> {
                System.out.println("Task " + taskNumber + " is running on thread " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }

        // 关闭线程池,但不会立即终止线程
        threadPool.shutdown();

        // 设置线程回收策略,允许非核心线程在一定时间内被回收
        threadPool.allowCoreThreadTimeOut(true);

        try {
            // 等待线程池中的任务执行完毕或超时
            threadPool.awaitTermination(10, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  在上面的示例中,我们创建了一个线程池,并通过allowCoreThreadTimeOut(true)设置允许核心线程在一定时间内被回收。这允许线程池在空闲一段时间后,回收多余的线程。在awaitTermination中,我们等待线程池中的任务执行完毕或超时。此时,线程池会回收多余的线程,根据需要创建新的线程。

  需要注意的是,线程回收策略是由线程池的实现来管理的,不同的线程池实现可能有不同的策略。上面的示例使用了ThreadPoolExecutor,而其他线程池实现可能会有不同的方法和选项来控制线程回收。

0 分享到:
和我们在线交谈!