2017-11-09 11 views
1

私はJavaマルチスレッドの初心者ですので、私の質問は不合理なことがあります。私はそれが他の方法で動作するか理解してください。ExecutorServiceでタイムアウトしたスレッドのみを終了するにはどうすればよいですか?

ExecutorService executor = Executors.newCachedThreadPool(); 

      List<Future<Boolean>> futures = new ArrayList<>(); 
      for (int i = 0; i < emailAddressList.size(); i++) { 
       futures.add(executor.submit(new Verify(emailAddressList.get(i)))); 
      }   
      executor.shutdown(); 
      while(!executor.awaitTermination(3, TimeUnit.SECONDS)); 

      for (int i = 0; i < emailAddressList.size(); i++) { 
       bufferedWriter.write(emailAddressList.get(i) + "|" + futures.get(i).get()); 
       bufferedWriter.newLine(); 
      } 

      bufferedWriter.close(); 

awaitTerminationループでは、TimeOutを3秒に設定しました。私がここで達成しようとしていることは、このタイムアウトで、少なくとも3秒間生存していたスレッドを終了したいのです。しかし、私はそれをどのように特定するのですか?

答えて

0

これらは自動的に終了します。あなたのループは役に立たない。

タスクが終了するまでに3秒間を要し​​ている場合は、実行中のスレッドを強制的に停止しようとするshutdownNow()コールを除いて、タスクがまだ完了していない場合はあまり効果がありません。タスクに3秒以上かかることがあると思う場合は、タイムアウトを増やしてください。しかし、ループには使用できません。

実際、すべてのタスクが終了するのを待つのにはおそらく役に立たないでしょう。結果が利用できない場合はFuture.get()がブロックされるため、結果をループするだけで済みます。もちろん、Verifyが(時間切れのない長時間実行されるネットワーク操作のような)潜在的に危険な操作を行う場合、これはすべてをブロックする可能性があります。しかし、このコードではなく、Verifyで修正する必要があります。

+0

私はそれを行うことができます。しかし、shudowNow()はキューのすべてのジョブも終了させますか?実行しているタスクも含めて、右か? –

+0

キューにあって実行を開始しなかったタスクを返します。スレッドを中断して実行中のタスクを停止しようとします。適切なタイムアウトを設定すると、 'shutdown()'を呼び出すだけで十分でしょう。タイムアウトが超過して何か問題がある場合は、 'shutdownNow()'が必要です。 – Kayaman

+0

私はそれが実行しなかったものを返すことを理解しています、あなたは提案します、私はこれらの未使用のタスクを再度実行するために実行に提出しますか? –

関連する問題