2011-10-21 7 views
0

私は可変時間に非同期に10のタスクを起動しなければなりません。次の日に近づくほど、これらの10のタスクをさらに繰り返さなければなりません。可変時間にスレッド(タスク)のグループをスケジュールするにはどうすればよいですか?

私の質問は、どうすればいいですか?私はどのエグゼクティブを使うべきですか?メモリを管理する最善の方法は何ですか?

私はExecutors.newScheduledThreadPoolを使用して、10回のタスクでスレッドプールプロセスを開始することができると考えました。この問題は、以前のタスクグループが完了していなくても(新しいスレッドプールが毎回トリガーされる)、新しいタスクセットを起動する必要があります。

また、プロセスレジストリのソートを使用して、起動されたさまざまなプロセスを管理することも考えています。レジストリ以外のプロセスが使用されていない場合は、レジストリを停止することができます。

そして、タスクが完了するたびに、私はrunnablesをフラッシュし、スレッドプールを停止することを考えました。それは全体的に良い解決策ですか?

発生する可能性がある問題は、メモリをスレッドプールで飽和させることです。たぶんスレッドプールに時間制限を入れますか?

ExecutorService ex = Executors.newFixedThreadPool(1); 
    final ExecutorService workersPool = Executors.newCachedThreadPool(); 

    ex.submit(new Runnable() { 
     public void run() { 
      try { 
       do { 
        // determine if it's time to start workers 
        if (timeToStartWorkers()) { 
         workersPool.submit(new Worker(...)); 
         workersPool.submit(new Worker(...)); 
         ... 
        } 
        // sleep till next time 
        Thread.sleep(timeTillNextCheck); 
       } 
      } catch (InterruptedException e) { 
       // handle exception 
      } 
     } 
    }); 

スレッドプールを再作成する必要はありません:

答えて

1

私が推測するに、1つの派遣平野非スケジューリングプール内のスレッドと労働者のための別のプール、このようなものが必要。

+0

あなたの答えはビクターに感謝します。私はinvokeallメソッドを使用して結果を取得する予定でしたが、私はまだそれを使用できると思います。私は来週それを試してみる。 – Alain

関連する問題