1. newScheduledThreadPool(1)和 new Thread(){while(true){sleep}} 区别?
答:貌似没什么大区别
newSingleThreadPool队列排队多了,也不会创建非核心线程去执行;
sleep不会释放锁,如果在同步代码块中使用sleep,线程会持有该对象锁直到sleep结束。
2.如何优雅的退出线程和线程池
2.1.Thread.currentThread().interrupt();线程中检测中断标记
只是设置了中断标志位,而不是直接粗暴的把线程中断
2.2. 优雅中断线程池
shutdown+awaitTermination+shutdownNow(超时直接强杀)
尝试调用shutdown()
方法开始优雅地关闭线程池,然后调用awaitTermination()
等待所有任务执行完毕。如果在指定时间内任务仍然没有完成,则调用shutdownNow()
方法中断所有正在执行或暂停的任务。最后,通过isTerminated()
检查线程池是否已经关闭,如果没有,则再次调用shutdownNow()
以确保线程池不会保持在不稳定状态。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class GracefulThreadPoolShutdown {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(10);
// 提交任务到线程池
// ...
// 优雅地关闭线程池
try {
executorService.shutdown(); // 启动优雅关闭序列
if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) { // 等待任务执行完成
executorService.shutdownNow(); // 超时则中断当前执行的任务
}
} catch (InterruptedException e) {
// 重新中断线程
Thread.currentThread().interrupt();
} finally {
// 最终确保线程池被关闭
if (!executorService.isTerminated()) {
executorService.shutdownNow();
}
}
}
}