面试题答案
一键面试设置线程空闲存活时间的代码
在Java线程池中,可以通过ThreadPoolExecutor
类的构造函数或setKeepAliveTime
方法来设置线程的空闲存活时间。示例代码如下:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadPoolExample {
public static void main(String[] args) {
// 使用ThreadPoolExecutor构造函数设置空闲存活时间
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // 核心线程数
4, // 最大线程数
10, // 空闲存活时间为10秒
TimeUnit.SECONDS,
Executors.defaultThreadFactory(),
new java.util.concurrent.LinkedBlockingQueue<>()
);
// 或者通过setKeepAliveTime方法设置
executor.setKeepAliveTime(10, TimeUnit.SECONDS);
// 提交任务
for (int i = 0; i < 10; i++) {
executor.submit(() -> {
System.out.println(Thread.currentThread().getName() + " is working");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
// 关闭线程池
executor.shutdown();
}
}
空闲存活时间在整个线程池运行机制中的作用
- 动态调整线程数量:空闲存活时间是线程池根据任务负载动态调整线程数量的重要参数。当任务队列中的任务减少,工作线程处于空闲状态的时间超过空闲存活时间时,线程池会考虑减少线程数量,以避免资源浪费。
- 资源管理:它有助于在任务较少时,释放多余的线程资源,将线程池的线程数量维持在合理水平,特别是在长时间运行且任务负载波动较大的应用场景中,能够有效控制资源消耗。
当一个线程达到空闲存活时间后会发生什么
- 线程回收:如果线程池当前的线程数量大于核心线程数,且有线程处于空闲状态的时间超过了空闲存活时间,那么这个空闲线程将被回收。线程池会终止该线程,减少线程池中活动线程的数量。
- 线程池调整:线程数量的减少使得线程池可以根据任务负载动态调整规模,当后续有新任务到来时,如果当前线程数量小于最大线程数,线程池会创建新的线程来处理任务,以适应任务需求。