【发布时间】:2015-10-20 01:45:32
【问题描述】:
我是 Java 并发的新手,想问以下基本问题。我正在创建一个 ThreadPoolExecutor 来提高性能,如下所示:
int n = Runtime.getRuntime().availableProcessors()
ExecutorService executor = Executors.newFixedThreadPool(n);
for( int i = 0; i < n; i++)
executor.execute(new Work());
在线程池中的所有线程完成任务后,我需要正确关闭池。我会尝试这个:
while(true){
if(executor.isTerminated()){
executor.shutdownNow();
break;
}
}
但我不确定这一点,因为我认为我们浪费了大量的处理器资源来查询执行程序是否终止。
什么是正确的解决方案?
UPD:可运行任务:
public class Work implements Runnable{
private String sql;
public Work() {
//init sql
}
@Override
public void run() {
JdbcTemplate template = new JdbcTemplate(dataSource);
@SuppressWarnings("unchecked")
List<Integer> ints = template.queryForList(sql, Integer.class);
//Storing the list into a global cache
}
}
【问题讨论】:
-
你也可以展示 Runnable 类吗?您的线程实现使您的线程可以安全关闭,您应该根据安全关闭来编写它们
-
请参阅this answer 类似问题。
-
@Neron 当然,更新
-
来自the documentation:“请注意,
isTerminated永远不会是true,除非首先调用shutdown或shutdownNow”。所以你的代码根本没有意义。
标签: java multithreading