Java并发编程:线程池阻塞问题案例
在Java的并发编程中,线程池阻塞问题通常与调用非空线程池的shutdown()方法或者shutdownNow()方法有关。
例如,以下代码会遇到问题:
// 创建一个非空线程池
ExecutorService executor = Executors.newFixedThreadPool(10);
// 一些任务提交给线程池执行
for (int i = 0; i < 20; i++) {
executor.execute(new Task(i)));
}
// 在使用shutdown()方法后,如果还有未完成的任务,会阻塞调用者
executor.shutdown();
// 然而,如果你想立即停止所有任务并返回已提交的任务列表,应该使用shutdownNow()
List<Runnable> tasks = executor.shutdownNow().getTasks();
在上述代码中,shutdown()
方法默认等待所有任务完成。因此,当调用executor.shutdown();
后,后续的尝试获取新任务将被阻塞。
而shutdownNow()
方法则会立即停止所有正在执行的任务,并返回一个包含了这些未完成任务引用的列表。这样就可以避免阻塞问题。
还没有评论,来说两句吧...