0

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?

+0

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 –

+1

Die Lösung besteht darin, die Ressource zu schließen, auf der der Thread blockiert . Der Worker sollte damit rechnen, IOExceptions zu behandeln. –

+0

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? –

Antwort

0

schedule() gibt eine ScheduledFuture zurück, die eine boolean cancel(boolean mayInterruptIfRunning) Methode hat. Wenn der Eingabestrom durch Thread-Unterbrechung geschlossen werden kann, rufen Sie ihn einfach mit true auf.

Wenn der Stream nicht unterbrechbar ist, müssen Sie ihn explizit schließen.

0

Ich habe herausgefunden, nachdem Sie all Ihre Vorschläge gelesen haben. Vielen Dank für Ihre Hilfe, besonders für die 8472. Ich habe folgendes geändert: 1) Change ScheduledExecutorService zu ScheduledThreadPoolExecutor. Aus bestimmten Gründen funktioniert ScheduledFuture Abbrechen nicht mit ScheduledExecutorService in meinem Code und ich weiß nicht warum. 2) Schließen Sie den BufferedReader beim Abbrechen der Klasse manuell.

Hoffe, das wird helfen, jemand hat ähnliche Probleme.