Ich benutze Java 8. Ich habe einen Thread muss zu einem bestimmten Zeitpunkt starten und zu einem bestimmten Zeitpunkt enden. Ich benutze ScheduledExecutorService
, um den Job zu erledigen:ScheduledExecutorService Shutdown funktioniert nicht mit bufferedreader?
Ich habe zwei Threads ein Name ist "Arbeiter" und der andere ist "Stopworker". Die Worker
Klasse enthält den tatsächlichen Code, den ich zu der bestimmten Zeit ausführen muss, der Thread "stopworker" beendet einfach den Scheduler.
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
scheduler.schedule(worker, startSeconds, TimeUnit.SECONDS);
scheduler.schedule(stopWorker, endSeconds, TimeUnit.SECONDS);
Meine Worker
Klasse:
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();
}
}
}
Meine StopWorker
Klasse:
class StopWorker implements Runnable {
@Override
public void run() {
try {
scheduler.shutdownNow();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Mein Code zu dem Zeitpunkt beginnen kann ich will, aber es ist nicht richtig ausgeschaltet. Ich habe diesen Code ein wenig bitteschön und fand dies, weil die BufferedReader
Klasse ich verwendet habe.
Wenn ich den "Worker" -Thread in eine einfache Thread-Sleep-Anweisung ersetzt habe und mein "Stopworker" funktioniert! Deshalb denke ich, dass ein I/O-Teil mein Herunterfahren blockieren könnte.
Die einzige Möglichkeit, den Thread herunterzufahren ist, indem ich meine BufferedReader
Variable global mache und sie manuell in StopWorker
Klasse schließe. Allerdings wird der Code hässlich sein und ein IOException
wird in den Code geworfen werden.
Mein Raten ist die shutdownNow
Funktion wartet immer noch das I/O-Finish zuerst, bin ich richtig? Gibt es einen guten Weg, dies elegant zu lösen? Oder gibt es eine bessere Möglichkeit, einen Thread zu einem bestimmten Zeitpunkt zu starten und zu einem bestimmten Zeitpunkt zu beenden?
Schließen Sie "BufferedReader reader" ordnungsgemäß in Ihrer Thread-Implementierung? Ziehen Sie es in [try-with-resources] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) Block –
Die Lösung besteht darin, die Ressource zu schließen, auf der der Thread blockiert . Der Worker sollte damit rechnen, IOExceptions zu behandeln. –
Ja, ich habe versucht, endlich in meinem Code zu blockieren, tut mir leid, ich habe vergessen, es zu dem Beitrag hinzuzufügen, ich habe das bearbeiten. Wie schließe ich einen Thread, der blockiert? Wo kann ich diesen Code hinzufügen? –