0

私のメイン フローには、スレッド プール ExecutorService があり、invokeAll() という "既知の" 数の Callable を入れます。

また、「globalPool」と呼ばれる別の ExecutorService オブジェクトがあります (ExecutorService はスレッドセーフであり、別のスレッドからタスクを追加できるという私の主張)。

ここで、上記の Callable のそれぞれが新しいタスクを生成し、それらをこの共有された「globalPool」に配置 (送信) します。

問題は、すべてのタスクがいつ完了したか、および次のタスクがなくなったかどうかを知ることができない (ブロックできない) ことです。

手伝ってください。

コードスニペット:

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);

私が見ているように、Callable はRunable が終了する前に終了します。

4

1 に答える 1

0

Callables をすべて呼び出すと、 Callables に対応する Future の List が返されます。その Futures を使用すると、Callables が yourFutureList.get(futureOfInterestIndex).isDone() によって完了したかどうかを簡単に確認できます。

于 2013-06-05T11:11:29.083 に答える