thread não é passível de interrupção

studentaccount4:

Eu estou tentando trabalhar nas famosas jantar dos filósofos e seu completamente acabada, mas eu estou tendo um tempo muito difícil tentando tópicos de interrupção.

Então, como você sabe neste problema que temos 5 tópicos (filósofos) e o conjunto usuário uma Experiência do tempo em que o experimento vai acabar.

vale a pena notar que eu olhei múltiplas respostas sobre StackOverflow.

O primeiro é de @ Konrad Reiche Como você matar um thread em Java? / Link Stackoverflow

Nesse post especial, as pessoas afirmaram que o uso de boolean volátil como uma bandeira pode trabalhar fora, mas eu tenho medo que é afirmado no jornal exercício que eu não posso usar o boolean volátil para interromper uma discussão, mas eu posso usá-lo para outros fins . (Estudando exercício).

A segunda é de interrupção Thread () não rosca interrupção link / Stackoverflow

ainda nada realmente ajudou !.

Vou tentar dar o código necessário e espero que alguém iria apenas apontar meu erro / s. a classe filósofo é público e estende Thread !.

1) Primeira tentativa: (pode ser rejeitado pelo professor, se ele não quer que usemos boolean volátil como bandeira)!

ao usar boolean volátil como esta 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());
        }
    }
}

[UPDATE] na segunda tentativa: [TRABALHO]

substituindo selfPhilosopher.isInterrupted()com Thread.currentThread().isInterrupted()não faz qualquer diferença comoselfPhilosopher=this;

mas eu estava ficando "vai parar" do stopPhilosopher()método, mas os fios parecem ser como zumbis continuam chegando de volta à vida :(

devido ao fato de que eu estou muito convencido pela opinião de @ Konrad Reiche da primeira referência fornecidos ea resposta de @ Nathan Hughes vou ficar com o uso do sinalizador booleano fornecido pelo java isInterrupted()em vez de usar uma bandeira 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();
        }
    }
}

RESULTADO:

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

Quando um InterruptedException é lançada, o flag de interrupção é apagada. Isso significa que a próxima verificação seu loop marcas indicará o segmento não é interrompido ea linha vai continuar a correr. Isso é o que você está vendo quando o seu último bloco imprime false para o flag de interrupção.

Isso é descrito no doc API para o método de sono :

InterruptedException - se alguma discussão interrompeu o segmento atual. O estado interrompido do segmento atual é apagada quando essa exceção é lançada.

Adicione esta linha ao bloco de onde você pegar um InterruptedException:

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

Acho que você gosta

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