【问题标题】:Multiple threadpools integration多线程池集成
【发布时间】:2013-06-01 00:54:05
【问题描述】:

在我的主要流程中,我有一个线程池 ExecutorService,我用“已知”数量的 Callables 填充它,我调用All()。

还有另一个名为“globalPool”的 ExecutorService 对象(我认为 ExecutorService 是线程安全的,我可以从不同的线程向它添加任务)。

现在,上述每个 Callables 都会生成新任务并将它们(提交)到这个共享的“globalPool”中。

问题是我无法知道(无法阻止)所有任务何时完成以及是否没有更多传入任务。

请帮忙。

代码sn-p:

public class Worker implements Callable {

        private ExecutorService sharedPool;

        public Worker (ExecutorService pool){
          this.sharedPool = pool;
        }




    public boolean call() {
        for (int i = 0; i<100; i++){
           if(i % 10 == 0){
              sharedPool.submit(new Runnable() {                            
                            public void run() {
                               heavyTaskHere();
                            }
                        }   
           }

        }

    }

}


Main flow:

ExecutorService sharedPool = new Executors.newFixedThreadPool(X);
List<Callable<Boolean>> mainthareadPool=  new ArrayList<Callable<Boolean>>();
ExecutorService executor =  Executors.newFixedThreadPool(N);


for (int i = 0; i<10; i++){
  Wroker w = new Worker (sharedPool);
    mainthareadPool.add(w);
}


executor.invokeAll(mainthareadPool);

在我看来,Callables 将在 它们的 Runable 结束之前结束。

【问题讨论】:

  • 如果你不知道还有没有任务要来,你怎么知道“全部”是什么
  • @Fildor,每个可调用对象都会根据某些逻辑产生新任务。
  • 请给我们一些代码。想象一下,您可以等待“所有”任务完成。您怎么知道不会再创建您必须等待的任务?我想如果你能回答这个问题,你就会向前迈出一大步。
  • 我添加了代码 sn-p

标签: java multithreading threadpool


【解决方案1】:

如果您调用所有您的 Callables,您将返回一个与您的 Callables 对应的期货列表。使用该期货,您可以通过 yourFutureList.get(futureOfInterestIndex).isDone() 简单地查看 Callables 是否已完成

【讨论】:

  • 但是当 callable 执行它的线程时,它不会等待它们完成并结束,所以主流程也会结束
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2010-10-16
  • 2023-03-12
  • 2021-08-28
  • 2022-11-02
相关资源
最近更新 更多