2012-04-02 8 views
6

Digamos que comenzó un hilo y tengo algo como esto:¿Se puede interrumpir BufferedReader.readLine() con Future.cancel (verdadero)?

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

      } 

    } 

); 

ejecutor es un objeto ExecutorService y es un objeto BufferedReader

Sé que puede cerrar la toma de un hilo diferente para interrumpir este hilo Pero cuando trato de usar el método future.cancel (true), a pesar de que devuelve verdadero, el hilo parece estar ejecutándose, ¿alguien sabe por qué? o in.readLine() no se puede alterar de esta manera?

Respuesta

10

¿Puede interrumpir BufferedReader.readLine() con Future.cancel (true)?

Todo es thread.interrupt() en el hilo asociado. Esto provocará que las operaciones sleep() y wait() arrojen un InterruptedException y que interrumpan algunos especiales NIO channels.

Pero es probable que su BufferedReader no se interrumpa ya que lo más probable es que lea desde un socket o archivo "normal". Como mencionas, cerrar el socket subyacente de un hilo diferente es la mejor manera de eliminar un método IO.

1

readLine no arroja InterruptedException por lo que no se verá afectado si el hilo que se ejecuta se interrumpe. Es necesario comprobar explícitamente el estado interrumpida de la rosca:

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

Pero si bloquea durante la ejecución de readLine, la única manera de interrumpir Es para cerrar la secuencia subyacente que lanzar una IOException.

3

Puede cerrar el flujo continuo para activar una excepción IOException. De lo contrario, un readLine() puede bloquear para siempre.

He examinado el uso de JavaLangAccess.blockedOn() pero parece bastante bajo nivel.

Cuestiones relacionadas