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!..
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