当前位置:编程学习 > JAVA >>

平台中使用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());
                }
            }
这两种方法,就没问题。什么导致这个问题的出现,望解答 --------------------编程问答-------------------- 池中总共有多少线程?

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

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

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

jdk的版本用的是多少?会不会是http://www.ticmy.com/?p=239中描述的第一个问题 --------------------编程问答-------------------- 使用Executors.newFixedThreadPool共开5个线程,在call()的方法中有log记录,如果一个线程退出,其他的线程及时在没有运行完成,log也不在记录。
jdk版本是1.6 --------------------编程问答-------------------- call里的方法有没有可能被阻塞,导致走不下去?

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

引用 2 楼  的回复:
使用Executors.newFixedThreadPool共开5个线程,在call()的方法中有log记录,如果一个线程退出,其他的线程及时在没有运行完成,log也不在记录。
jdk版本是1.6
补充:Java ,  Web 开发
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,