hilo no es interrumpible

studentaccount4:

Estoy tratando de trabajar en los famosos filósofos de comedor y es bastante acabada pero estoy teniendo un tiempo bastante difícil tratar de hilos de interrupción.

Así como se sabe en este problema que tenemos 5 hilos (filósofos) y el conjunto de usuarios un tiempo experimento en el que va a terminar el experimento.

vale la pena notar que me parecía múltiples respuestas en StackOverflow.

El primero es de @Konrad Reiche ¿Cómo matas a un hilo en Java? / Link Stackoverflow

En ese puesto en particular, la gente ha afirmado que el empleo booleano volátil como una bandera podría funcionar, pero me temo que se afirma en el documento de ejercicio que no puedo utilizar el booleano volátil para interrumpir un hilo, pero que pueden utilizarla para otros fines . (Estudio de ejercicio).

El segundo es de rosca de interrupción () no se hilo de interrupción / link Stackoverflow

sin embargo, nada realmente ayudó !.

Voy a tratar de proporcionar el código necesario y espero que alguien se acaba de señalar mi error / s. la clase Filósofo es público y se extiende Tema !.

1) Primer intento: (podría ser rechazado por el profesor si él no quiere que usemos booleano volátil como bandera)!

cuando se utiliza booleano volátil como esto funciona:

private volatile boolean isNotStopped=true;

@Override
public void stopPhilosopher() {
    System.out.printf("\n%s will stop.\n",selfPhilosopher.getName());
    selfPhilosopher.interrupt();
    isNotStopped=false;
}


@Override
public void run() {
    while (isNotStopped){//selfPhilosopher is a thread equals to this!.
        try {
                think();
                eat();
        } catch (InterruptedException e) {//somehow this was never triggered!.
            System.out.printf("%s was interrupted.\n",selfPhilosopher.getName());
        }finally {//in the finally block i always get RUNNER, FALSE
            System.out.printf("the %s is %s and is interrupted %b.\n", selfPhilosopher.getName(),selfPhilosopher.getState(), selfPhilosopher.isInterrupted());
        }
    }
}

[ACTUALIZACIÓN] en el Segundo intento: [TRABAJO]

sustituyendo selfPhilosopher.isInterrupted()con Thread.currentThread().isInterrupted()no hizo ninguna diferencia en cuantoselfPhilosopher=this;

sin embargo, yo estaba recibiendo "parará" del stopPhilosopher()método, pero los hilos parecen ser como zombies siguen regresando a la vida :(

debido al hecho de que estoy bastante convencido de la opinión de @Konrad Reiche desde la primera referencia proporcionada y la respuesta de @ Nathan Hughes que se quede con el uso de la bandera booleana proporcionada por el java isInterrupted()en lugar de usar una bandera volátil.

@Override
public void stopPhilosopher() {
    System.out.printf("\n%s will stop.\n",selfPhilosopher.getName());
    selfPhilosopher.interrupt();

}

@Override
public void run() {
    while (!selfPhilosopher.isInterrupted()){//selfPhilosopher is a thread equals to this!.
        try {
                think();
                eat();
        } catch (InterruptedException e) {//somehow this was never triggered!.Now it works.
            System.out.printf("%s was interrupted from catch clause!..\n",selfPhilosopher.getName());
            selfPhilosopher.interrupt();
        }
    }
}

SALIDA:

 Philosopher2 in seat nr: 2 was interrupted from catch clause!..
Nathan Hughes:

Cuando se lanza una InterruptedException, el indicador de interrupción se borra. Eso significa que el próximo cheque de sus marcas bucle indicarán el hilo no se interrumpe y el hilo siempre está en funcionamiento. Eso es lo que están viendo cuando su finally imprime falsa con el indicador de interrupción.

Esto se describe en el doc API para el método del sueño :

InterruptedException - si cualquier mensaje ha interrumpido el flujo actual. El estado interrumpida del hilo actual se borra cuando se lanza esta excepción.

Añade esta línea al bloque donde puedes coger un InterruptedException:

Thread.currentThread().interrupt();  // restores interrupt flag

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=400903&siteId=1
Recomendado
Clasificación