0

私はJava 8を使用しています。スレッドは特定の時刻に開始し、特定の時刻に終了する必要があります。私は仕事をするScheduledExecutorServiceを使用しています:ScheduledExecutorServiceのシャットダウンがbufferedreaderで機能していませんか?

私は1人の名前は「労働者」であり、他は「stopworker」である二つのスレッドを持っています。 Workerクラスには、特定の時刻に実行する必要がある実際のコードが含まれています。「ストップワーカー」スレッドはスケジューラをシャットダウンします。

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2); 
scheduler.schedule(worker, startSeconds, TimeUnit.SECONDS); 
scheduler.schedule(stopWorker, endSeconds, TimeUnit.SECONDS); 

マイWorkerクラス:

class Worker implements Runnable { 
     @Override 
     public void run() { 
      try { 
      // HTTP GET method to call and REST API and get Streaming 
      // data back, it will keep alive as long as possible and 
      // gets lots of data back 
      ... 
      BufferedReader reader = new BufferedReader(
        new InputStreamReader(response.getStream())); 
      // deal with the data 
      ... 
      } catch (IOException e) { 

      } finally { 
        reader.close(); 
      } 
     } 
} 

マイStopWorkerクラス:

class StopWorker implements Runnable { 
     @Override 
     public void run() { 
      try { 
       scheduler.shutdownNow(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
} 

私のコードは、私が欲しい時に起動することができますが、それは正しくシャットダウンではありません。私はこのコードをちょっと試してみましたが、これはBufferedReaderクラスを使用したためです。

私は、単純なスレッドのスリープ文に「労働者」スレッドと私の「stopworker」作品を交換した場合!だから私はI/Oの部分が私のシャットダウンをブロックするかもしれないと思うのです。

スレッドをシャットダウンする唯一の方法は、BufferedReader変数をグローバルにして、StopWorkerクラスで手動で閉じることです。しかし、コードは醜くなり、IOExceptionがコードにスローされます。

私の推測がshutdownNow機能ですが、まだ私は右だ、最初のI/Oの仕上げを待っていますか?これをエレガントに解決する良い方法はありますか?または、特定の時刻にスレッドを開始し、特定の時刻に終了するためのより良い方法がありますか?

+0

はあなたが 'BufferedReaderのは、あなたのスレッド実装で適切にreader'閉じていますか? [try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)ブロックにラップすることを検討してください。 –

+1

解決方法は、スレッドがブロックしているリソースを閉じることです。作業者はIOExceptionを処理することを期待する必要があります。 –

+0

はい、私は最終的に私のコードでブロックをキャッチしようとしました、私はそれを投稿に追加することを忘れて申し訳ありません、私は編集しています。スレッドをブロックするにはどうすればよいですか?そのコードをどこに追加できますか? –

答えて

0

schedule()は、boolean cancel(boolean mayInterruptIfRunning)メソッドを持つScheduledFutureを返します。入力ストリームがスレッド中断によってクローズ可能な場合はtrueを指定して呼び出します。

流れが中断されていない場合、あなたは明示的にクローズする必要があります。

0

私はすべてのご提案を読んだ後、これを理解しています。特にthe8472のおかげで、あなたの助けに感謝します。 以下を変更しました: 1)ScheduledExecutorServiceをScheduledThreadPoolExecutorに変更します。 何らかの理由で、ScheduledFuture cancelが自分のコードでScheduledExecutorServiceと動作しないため、理由がわかりません。 2)クラスをキャンセルするときにBufferedReaderを手動で閉じます。

これは誰かが同様の問題を抱えていることを願っています。

関連する問題