2012-04-02 9 views
6

Powiedzmy Zacząłem wątek i mam coś takiego:Czy można przerwać BufferedReader.readLine() z Future.cancel (true)?

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

      } 

    } 

); 

wykonawca jest obiektem ExecutorService iw to obiekt BufferedReader

Wiem, że można zamknąć gniazdo z innego wątku, aby przerwać ten wątek. Ale kiedy próbuję użyć metody future.cancel (true), mimo że zwraca ona wartość true, wątek nadal działa, czy ktoś wie dlaczego? lub in.readLine() nie można przerwać w ten sposób?

Odpowiedz

10

Czy można przerwać BufferedReader.readLine() z Future.cancel (true)?

jest to wywołanie thread.interrupt() w powiązanym wątku. Spowoduje to, że operacje sleep() i wait() rzucą InterruptedException i przerwie niektóre specjalne NIO channels.

Możliwe jednak, że twój BufferedReader nie zostanie przerwany, ponieważ najprawdopodobniej jest to odczyt z "normalnego" gniazda lub pliku. Jak wspomniałeś, zamknięcie podstawowego gniazda z innego wątku jest najlepszym sposobem na zabicie takiej metody IO.

1

readLine nie rzuca InterruptedException, więc nie ma wpływu na wątek, w którym działa, jest przerywany. Trzeba wyraźnie sprawdzić przerwaną status wątku:

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

ale jeśli bloki podczas wykonywania readLine, jedynym sposobem, aby przerwać to, aby zamknąć podstawowy strumień, który wygeneruje IOException.

3

Można zamknąć strumień w celu wywołania wyjątku IOException. W przeciwnym razie readLine() może blokować na zawsze.

Sprawdziłem przy użyciu JavaLangAccess.blockedOn(), ale wygląda raczej niski poziom.

Powiązane problemy