0

J'utilise Java 8. J'ai besoin d'un thread pour démarrer à un moment précis et se terminer à un moment précis. J'utilise ScheduledExecutorService pour faire le travail:L'arrêt ScheduledExecutorService ne fonctionne pas avec Bufferedreader?

J'ai deux fils un nom est "travailleur" et l'autre est "stopworker". La classe Worker contient le code que j'ai besoin d'exécuter au moment spécifique, le thread "stopworker" arrête simplement le planificateur.

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

Ma Worker classe:

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(); 
      } 
     } 
} 

Ma StopWorker classe:

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

Mon code peut commencer à l'heure que je veux, cependant, ce n'est pas l'arrêt correctement. J'ai bidouillé ce code un petit peu et j'ai trouvé ceci parce que la classe BufferedReader que j'ai utilisée.

Si j'ai remplacé le thread "worker" dans une simple déclaration de thread de sommeil et mon "stopworker" fonctionne! C'est pourquoi je pense que la partie E/S pourrait bloquer mon arrêt. La seule façon d'arrêter le thread est de rendre ma variable BufferedReader globale et de la fermer manuellement en classe StopWorker. Cependant, le code sera moche et un IOException sera jeté dans le code.

Je devine que la fonction shutdownNow attend toujours la fin de l'E/S en premier, ai-je raison? Y at-il un bon moyen de résoudre cela élégamment? Ou y a-t-il une meilleure façon de faire démarrer un fil à un moment précis et se terminer à un moment précis?

+0

Fermez-vous 'BufferedReader reader' correctement dans votre implémentation de threads? Envisagez de le faire dans [try-with-resources] (https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html) block –

+1

La façon de résoudre est de fermer la ressource sur laquelle le thread bloque . Le travailleur doit s'attendre à gérer les IOExceptions. –

+0

Oui, j'ai essayé de bloquer enfin dans mon code, désolé j'ai oublié de l'ajouter à la poste, je l'ai édité. Comment fermer un thread est bloqué? Où puis-je ajouter ce code? –

Répondre

0

schedule() renvoie ScheduledFuture, qui a une méthode boolean cancel(boolean mayInterruptIfRunning). Si le flux d'entrée peut être fermé par une interruption de thread, appelez-le simplement avec true.

Si le flux n'est pas interruptible, vous devez le fermer explicitement.

0

Je l'ai compris après avoir lu toutes vos suggestions. Merci pour votre aide, en particulier pour the8472. J'ai modifié les éléments suivants: 1) Modifiez ScheduledExecutorService à ScheduledThreadPoolExecutor. Pour certaines raisons, ScheduledFuture cancel ne fonctionne pas avec ScheduledExecutorService dans mon code et je ne sais pas pourquoi. 2) Fermer manuellement BufferedReader lors de l'annulation de la classe.

Espérons que cela aidera quelqu'un a les mêmes problèmes.