2016-03-23 9 views
0

私は約900のタスクを持っています。スレッドプール数を50に設定しました。 ループを実行してすべてのタスクをexecutorServiceに送信しています。すぐにコントロールが各タスクは、私は2つの質問エグゼクティブサービスにはいくつかのタスクがありません

を持ってaverage.Nowに約1秒かかります

for (Entry<String, String> CurrentJob : Tasks.entrySet()) { 
      m_service.submit(new MyTask(CurrentJob.getValue(), CurrentJob.getKey())); 
     } 
      m_service.shutdown(); 

以下のように私はa)のほぼすべてのそれらのは、仕事をしているシャットダウンを呼び出して出てくるよう

(850)、約50が失われる。私は呼び出し可能にデバッガを置いていますが、コントロールはそれらの特定のタスクのためにそこに来ていません。私がそれらを個別に置くなら、彼らは働きますが。エグゼクティブサービスのどのロジックが欠けていますか?

b)私はこのコードの周りに、そしてjavaDocに従ってタイマーを入れました。シャットダウンは、すべてのスレッドが完了するまで待つべきですが、私のタイマーは常に時間がゼロになると言います。

答えて

0

ExecutorServiceは、以前に送信されたタスクが完了するまで待機しません。 JavaDocから:

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html#shutdown--

このメソッドは、実行を完了するために、以前に提出したタスクを待ちません。これを行うにはawaitTerminationを使用します。

だから何が起こっすることができることExecutorServiceのシャットダウンされ、キューに入れられた作業を完了するために続けますが、JVMは(生きているJVMを維持しないであろうだけでデーモンスレッドを残して)自分のメインスレッドが終了するので、終了しますか?多分それは問題ですか?

+0

いいえ。それは、制御が0秒で終了し、私の仕事が3〜4分後にも完了し続けるので起こらない。 私は引数のためだけに、shutdownをawaitTerminationに置き換えました。 – user2449952

0

実行者サービスによって拒否されたタスクを処理するにはThreadPoolExecutorはRejectedHandlerクラスを提供します。

ThreadPoolExecutor threadP =(ThreadPoolExecutor)Executors.newFixedThreadPool(3)。 threadP.setRejectedExecutionHandler(新しいRejectedHandler()); //タスクを追加する

threadP.shutdown()

+0

BlockingQueue blockingQueue = new ArrayBlockingQueue (1000);新しいスレッドを作成する m_service = new ThreadPoolExecutor(50、50、 0L、TimeUnit.MILLISECONDS、blockingQueue、rejectedExecutionHandler); まだ動作していません。あなたは少し精巧にできますか? – user2449952

関連する問題