平台中使用ExecutorService,CompletionService中的线程停止的问题

sun11506 2012-08-16 07:12:01
今天再使用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());
}
}
这两种方法,就没问题。什么导致这个问题的出现,望解答
...全文
352 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙四 2012-08-16
  • 打赏
  • 举报
回复
call里的方法有没有可能被阻塞,导致走不下去?

最好能贴出call一些代码来瞅瞅

[Quote=引用 2 楼 的回复:]

使用Executors.newFixedThreadPool共开5个线程,在call()的方法中有log记录,如果一个线程退出,其他的线程及时在没有运行完成,log也不在记录。
jdk版本是1.6
[/Quote]
sun11506 2012-08-16
  • 打赏
  • 举报
回复
使用Executors.newFixedThreadPool共开5个线程,在call()的方法中有log记录,如果一个线程退出,其他的线程及时在没有运行完成,log也不在记录。
jdk版本是1.6
龙四 2012-08-16
  • 打赏
  • 举报
回复
池中总共有多少线程?

按理说ExecutorCompletionService只是简单的封装了下线程池,并不会导致LZ说所的问题。

“但是,其中一个线程退出的话,其他正在运行的进行也不在运行”是怎么检测的?

调用线程池的getActiveCount,返回值是多少?

jdk的版本用的是多少?会不会是http://www.ticmy.com/?p=239中描述的第一个问题

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧