更新时间:2023-06-01 来源:黑马程序员 浏览量:
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秒内没有执行任务,它们将被终止并从线程池中移除。
在执行任务之前,我们向线程池提交了10个任务。每个任务打印了自己的ID和执行它的线程的名称,并在执行完后休眠了1秒钟。根据设置的keep-alive时间,如果在5秒内没有新的任务提交,多余的线程将被回收。
最后,我们调用executor.shutdown()来关闭线程池,确保所有的任务执行完毕后线程池能够正常退出。
需要注意的是,awaitTermination()方法用于等待线程池中的所有任务完成执行,或者等待超时时间到达。这样做是为了确保在关闭线程池之前,所有的任务都有机会执行完毕。