2009-10-13 16 views
5

De J2ME doc sabemos que:La causa de InterruptedException

java.lang.InterruptedException lanza cuando un hilo está esperando, durmiendo, o de lo contrario se detuvo por un largo tiempo y otro hilo se interrumpe.

La pregunta es si es posible obtener tal excepción si de un hilo llamo Thread.Interupt() para otro hilo donde el método Run() de otro hilo espera en InputStream.Read (char [] buf)?

Respuesta

5

El comportamiento de bloqueo de lectura en respuesta a la interrupción de hilo, de hecho, no está definido. Ver this long-standing bug para más detalles. En resumen, a veces obtienes EOF, a veces obtienes IOException.

+3

Normalmente no obtienes nada. – erickson

+0

NB El error de larga duración se resolvió en 2011: "Esto ya no es un problema en jdk7 porque la E/S interrumpible heredada está deshabilitada de manera predeterminada en Solaris. Nunca se implementó en Winodws y no se implementó en Linux desde jdk1. 3. " – EJP

4

Desafortunadamente, no, las clases java.io.* no responden a las interrupciones cuando están bloqueadas en métodos de lectura o escritura. Normalmente, lo que tienes que hacer es cerrar la transmisión y luego manejar el IOException que se lanza. Tengo este patrón repetido a lo largo de mi código:

try { 
    for (;;) { 
     try { 
      inputStream.read(data); 

      thread.join(); 
     } 
     catch (IOException exception) { 
      // If interrupted this isn't a real I/O error. 
      if (Thread.interrupted()) { 
       throw new InterruptedException(); 
      } 
      else { 
       throw exception; 
      } 
     } 
    } 
} 
catch (InterruptedException exception) { 
} 

Alternativamente, las nuevas clases java.nio.* manipule interrupciones mejores y generar InterruptedIOException s cuando son interrumpidos. Tenga en cuenta que esta excepción se deriva de IOException y no de InterruptedException, por lo que probablemente necesite dos cláusulas catch para manejar cualquier tipo de excepción, una para InterruptedException y otra para InterruptedIOException. Y querrá cualquier cláusula catch interna IOException para ignorar InterruptedIOException s.

+0

Lamentablemente, el método interrumpido() no se implementó en j2me – Pirks

+1

Eso es cierto, y tampoco en Thread.interrupt(). Entonces, ¿de dónde vendrá tu interrupción? ¿Qué motiva la pregunta? –

Cuestiones relacionadas