首页常见问题正文

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

更新时间:2023-06-01 来源:黑马程序员 浏览量:

IT培训班

  Java线程池中多余的线程是通过线程池的"keep-alive"机制来回收的。该机制定义了线程池中多余的线程的存活时间,在超过该时间后,空闲的线程将被终止并从线程池中移除。

  接下来我们看一段示例代码,演示了如何创建一个线程池并设置"keep-alive"时间:

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

public class ThreadPoolExample {
    public static void main(String[] args) throws InterruptedException {
        // 创建一个具有固定线程数量的线程池
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // 设置线程池的keep-alive时间为5秒
        int keepAliveTime = 5;
        executor.awaitTermination(keepAliveTime, TimeUnit.SECONDS);

        // 执行一些任务
        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            executor.execute(new Runnable() {
                public void run() {
                    System.out.println("Task " + taskId + " executed by " + Thread.currentThread().getName());
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }

        // 关闭线程池
        executor.shutdown();
    }
}

  在上面的代码中,我们使用Executors.newFixedThreadPool(5)创建了一个固定线程数量为5的线程池。然后,通过executor.awaitTermination(keepAliveTime, TimeUnit.SECONDS)设置了线程池的keep-alive时间为5秒。这意味着如果线程池中的线程在5秒内没有执行任务,它们将被终止并从线程池中移除。

1685583028023_如何回收线程池中多余的线程.jpg

  在执行任务之前,我们向线程池提交了10个任务。每个任务打印了自己的ID和执行它的线程的名称,并在执行完后休眠了1秒钟。根据设置的keep-alive时间,如果在5秒内没有新的任务提交,多余的线程将被回收。

  最后,我们调用executor.shutdown()来关闭线程池,确保所有的任务执行完毕后线程池能够正常退出。

  需要注意的是,awaitTermination()方法用于等待线程池中的所有任务完成执行,或者等待超时时间到达。这样做是为了确保在关闭线程池之前,所有的任务都有机会执行完毕。

分享到:
在线咨询 我要报名
和我们在线交谈!