2012-04-02 5 views
6

Lassen Sie uns sagen, dass ich einen Thread und ich habe so etwas wie dies begonnen:Können Sie BufferedReader.readLine() mit Future.cancel (true) unterbrechen?

...//initiate all the socket connection 
future = executor.submit 
( new Runnable() 
    { public void run() 
     { ... 
      ...  
      while ((str = in.readLine()) != null) 
      { //do something here 

      } 

    } 

); 

Testamentsvollstrecker ist ein ExecutorService Objekt und ist ein BufferedReader Objekt

Ich weiß, dass Sie die Steckdose von einem anderen Thread schließen kann zu unterbrechen Dieser Thread. Aber wenn ich versuche, future.cancel (true) -Methode zu verwenden, obwohl es wahr zurückgibt, scheint der Thread immer noch läuft, weiß jemand warum? oder in.readLine() kann nicht auf diese Weise unterbrochen werden?

Antwort

10

Können Sie BufferedReader.readLine() mit Future.cancel (true) unterbrechen?

All future.cancel(true) tut, ist thread.interrupt() auf dem zugehörigen Thread zu nennen. Dies führt dazu, dass die sleep() und wait() Operationen einen InterruptedException auslösen und einige spezielle NIO channels unterbrechen.

Aber Chancen sind Ihre BufferedReader wird nicht unterbrochen, da es wahrscheinlich von einem "normalen" Socket oder Datei liest. Wie Sie erwähnen, ist das Schließen des zugrunde liegenden Sockets aus einem anderen Thread der beste Weg, um eine solche IO-Methode zu beenden.

1

readLine wirft nicht InterruptedException, so dass es nicht betroffen ist, wenn der Thread, in dem es läuft, unterbrochen wird. Sie müssen explizit den unterbrochenen Status des Threads überprüfen:

 while ((str = in.readLine()) != null) 
     { 
      if (Thread.interrupted()) { 
       //You can deal with the interruption here 
      } 
     } 

Aber wenn es blockiert, während readLine Ausführung, der einzige Weg, es zu unterbrechen ist, den zugrunde liegenden Stream zu schließen, die eine IOException werfen.

3

Sie können den In-Stream schließen, um eine IOException auszulösen. Andernfalls kann readLine() für immer blockieren.

Ich habe mit JavaLangAccess.blockedOn() untersucht, aber es sieht eher niedrige Ebene.

Verwandte Themen