2017-10-03 16 views
2

URLに特定の機能を実行するJava 8ベースのプロジェクトがあります。以下のコードスニペットを修正して、スレッド/プロセスを強制終了し、現在のプロセスステータスに関係なく一定時間後に次のインスタンスを実行できるようにする必要があります。Java 8:特定の時間の後にスレッドを終了/停止する

私は、スレッドキル手順を実装するには、次の方法を試してみました:

  • キュータサービス
  • タイマータスク
  • マルチスレッドのスレッドが

私の最も最近の試みのためのコードスニペットがあるを殺しますリンク先

@SuppressWarnings("static-access") 
public static void main(String[] args) { 
//fetch url from the txt file 
    List<String> careerUrls = getCareerUrls(); 
    int a = 0; 
    DBConnection ds = null; 
    ds = DBConnection.getInstance(); 
    try (java.sql.Connection con = ds.getConnection()) { 
     //read a single Url 
     for (String url : careerUrls) { 
      int c = a++; 

      ExecutorService executor = Executors.newFixedThreadPool(3); 

      Future<?> future = executor.submit(new Runnable() { 
       @Override 
       // <-- job processing 
       public void run() { 
        long end_time = System.currentTimeMillis() + 10000; 

        System.out.println("STARTED PROCESSING URL: " + url); 
        jobareaDeciderSample w = new jobareaDeciderSample(); 
        w.mainSample(url, c, con); 

       } 
      }); 
      // <-- reject all further submissions 
      executor.shutdown(); 
      try { 
       future.get(120, TimeUnit.SECONDS); // <-- wait 2 Minutes to finish 
      } catch (InterruptedException e) { // <-- possible error cases 
       System.out.println("job was interrupted"); 
       future.cancel(true); 
       Thread.currentThread().interrupt(); 
       ; 
      } catch (ExecutionException e) { 
       System.out.println("caught exception: " + e.getCause()); 
      } catch (TimeoutException e) { 
       System.out.println("timeout"); 
       future.cancel(true); 

      } 

      // wait all unfinished tasks for 2 sec 
      if (!executor.awaitTermination(0, TimeUnit.SECONDS)) { 
       // force them to quit by interrupting 
       executor.shutdownNow(); 
      } 
     } 

    } catch (Exception e) { 
     LOGGER.error(e); 
    } 

} 

答えて

1

あなたは正しい方法です。 今後cancel(true);を呼び出すことは、このタスクを停止する正しい方法です。

スレッドを停止するだけでは問題はありません。 (よくスレッドクラスでstop()を使うことができますが、決してこれを行うべきではありません)。

cancel(true);はスレッドに情報を送信する必要があります。いくつかのJavaクラスはこの情報に応答し、中断された例外をスローします。しかし、いくつかいけない。タスクコードを変更してThread.currentThread().isInterrupted()かどうかを確認し、そうであれば実行を停止する必要があります。

これは、あなたがあなたがあなたがURLにいくつかのものを行うと述べた場合、あなたが行う必要があり、コードを紡績、いくつかの長い時間でこれを行う必要があります

jobareaDeciderSample w = new jobareaDeciderSample(); 
        w.mainSample(url, c, con); 

によって呼び出すあなたのコードにしなければならない何か、ですウェブの情報をダウンロードするあなたのwhileループで。言い換えれば、あなたのコードが99%の時間を費やしている場合にのみ、このチェックを行います。

また、あなたがあなたのメインスレッドで

 Thread.currentThread().interrupt(); 

を呼び出している、これはあなたが現在のスレッドを終了したいかのように、あなただけのあなたは `スレッドを使用する必要があります

+0

を返す呼び出すことができ、あなたのために何もしません。あなたがそれに反応しようとするならあなた自身のスレッドの中断をテストするために.interrupted() 'を使います。これにより、ステータスもクリアされます。 'someThreadInstance.isInterrupted()'メソッドは、状態を監視するためのものです(あなたが別のスレッドから呼び出すことさえあるかもしれません)ので、ステータスは影響を受けません。 – Holger

関連する問題