平台中使用ExecutorService,CompletionService中的线程停止的问题
今天再使用java.util.concurrent报时,使用
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(executor);
建立线程池,并通过下面代码提交任务
for (int i = 0; i < threadCount; i++) {
CalculateSalary call = new CalculateSalary(this);
Future<Object> future = executor.submit(call);
}
通过
for (int i = 0; i < threadCount; i++) {
Object result = completionService.take().get();
if(logger.isInfoEnabled()){
logger.info("Threads run results:::"+result.toString());
}
}
获取执行结果,但是,其中一个线程退出的话,其他正在运行的进行也不在运行。为什么?
运行中使用的ReadWriteLock进行信息共享,不存在锁不释放的情况。
后来尝试
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
List<Future<Object>> results = new ArrayList<Future<Object>>();
for (int i = 0; i < threadCount; i++) {
CalculateSalary call = new CalculateSalary(this);
Future<Object> future = executor.submit(call);
results.add(future);
}
for (Future<Object> fs:results) {
//fs.get()会等待线程返回出结果再执行
Object count=fs.get();
System.out.println(count);
}
和
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
CompletionService<Object> completionService = new ExecutorCompletionService<Object>(executor);
for (int i = 0; i < threadCount; i++) {
CalculateSalary call = new CalculateSalary(this);
Future<Object> future = completionService.submit(call);
}
for (int i = 0; i < threadCount; i++) {
Object result = completionService.take().get();
if(logger.isInfoEnabled()){
logger.info("Threads run results:::"+result.toString());
}
}
这两种方法,就没问题。什么导致这个问题的出现,望解答