java - concurrentmodificationexception - ¿Debo preocuparme por InterruptedExceptions si no interrumpo nada por mi cuenta?
concurrentmodificationexception java 8 (5)
Estoy usando java.util.concurrent.Semaphore
en un proyecto de hobby. Se usa en una clase de grupo de conexión que estoy escribiendo. Puedo usarlo con poco alboroto, excepto por este método:
public void acquire(int permits) throws InterruptedException
lo que me obliga a manejar la InterruptedException
. Ahora, no estoy seguro de qué significa "interrumpir" un hilo ni siquiera y nunca lo hago (bueno, no explícitamente) en mi código. ¿Esto significa que puedo ignorar la excepción? ¿Cómo debo manejarlo?
Debería salir del método run () después de realizar la limpieza requerida por su Thread.
HTH
Los hilos pueden ser interrumpidos llamando a Thread.interrupt (). Se usa para señalar con gracia un hilo que debería hacer otra cosa. Por lo general, provoca que las operaciones de bloqueo (por ejemplo, Thread.sleep ()) vuelvan antes y arrojen la InterruptedException. Si el hilo se interrumpe, se establece un indicador en él. Esta bandera se puede consultar a través de la llamada Thread.isInterrupted ().
Si no usas la interrupción del hilo y todavía obtienes esta excepción, puedes salir de tu hilo (y registrar la excepción).
En general, depende de lo que haga su aplicación multiproceso.
Nop. InterruptedException
solo se genera si usted mismo interrumpe el hilo. Si usted mismo no usa Thread.interrupt()
entonces lo volvería a lanzar como una especie de "excepción inesperada" o lo registraría como un error y continuaría. Por ejemplo, en mi código cuando me veo obligado a detectar InterruptedException
y nunca llamo a interrupt()
, hago el equivalente de
catch (InterruptedException exception) {
throw new RuntimeException("Unexpected interrupt", exception);
}
Eso es si es inesperado. Hay muchos lugares en los que interrumpo deliberadamente mis hilos y en esos casos manejo las InterruptedException
de una manera bien definida. Por lo general, eso es saliendo del bucle en el que estoy, limpiando y luego deteniendo el hilo.
Sí, debe preocuparse por InterruptedException
, del mismo modo que debe preocuparse por cualquier otra excepción comprobada que debe lanzar o manejar.
La mayoría de las veces, una InterruptedException
señala una solicitud de detención, muy probablemente debido al hecho de que el hilo que estaba ejecutando su código fue interrupted .
En su situación particular de un grupo de conexión esperando para obtener una conexión, diría que esto es un problema de cancelación y debe cancelar la adquisición, la limpieza y restablecer el indicador interrumpido (consulte a continuación).
Como ejemplo, si está utilizando algún tipo de Runnable
/ Callable
ejecutando dentro de un Executor
entonces necesita manejar la InterruptedException correctamente:
executor.execute(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch ( InterruptedException e) {
continue; //blah
}
pingRemoteServer();
}
}
});
Esto significaría que su tarea nunca obedece al mecanismo de interrupción utilizado por el ejecutor y no permite la cancelación / cierre correctos.
En cambio, la expresión apropiada es restaurar el estado interrumpido y luego detener la ejecución:
executor.execute(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch ( InterruptedException e) {
Thread.currentThread().interrupt(); // restore interrupted status
break;
}
pingRemoteServer();
}
}
});
Recursos útiles :
Si no sabes cómo manejarlo en un método, te sugiero que lo declares en el método con throws InterruptedException (y quien llama, etc.)
Si es algo que nunca espera que ocurra, lo atraparé y lo envolveré en un AssertionError.