更新时间: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()方法用于等待线程池中的所有任务完成执行,或者等待超时时间到达。这样做是为了确保在关闭线程池之前,所有的任务都有机会执行完毕。
毕业16个工作日,平均薪资13180元,就业率100%,广州黑马AI智能应用开发(Java)学科20250529班
2026-03-06毕业32个工作日,平均薪资11147元,就业率95%,广州黑马AI智能应用开发(Java)学科20250326班
2026-03-05黑马程序员2025全国就业数据发布:全学科平均就业率92.07%,AI开发类就业平均薪资达11869.67元。
2026-03-05黑马全国校区齐开班!场面太太太壮观了!
2026-03-03AI智能应用开发课程紧贴企业刚需,全程高效学习,直达中高级软件开发水平
2026-02-28风口正劲!黑马程序员又一AI智能应用开发班毕业当天100%就业!
2026-02-27