私は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の仕上げを待っていますか?これをエレガントに解決する良い方法はありますか?または、特定の時刻にスレッドを開始し、特定の時刻に終了するためのより良い方法がありますか?
はあなたが 'BufferedReaderのは、あなたのスレッド実装で適切にreader'閉じていますか? [try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html)ブロックにラップすることを検討してください。 –
解決方法は、スレッドがブロックしているリソースを閉じることです。作業者はIOExceptionを処理することを期待する必要があります。 –
はい、私は最終的に私のコードでブロックをキャッチしようとしました、私はそれを投稿に追加することを忘れて申し訳ありません、私は編集しています。スレッドをブロックするにはどうすればよいですか?そのコードをどこに追加できますか? –