更新时间: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()方法用于等待线程池中的所有任务完成执行,或者等待超时时间到达。这样做是为了确保在关闭线程池之前,所有的任务都有机会执行完毕。