Я пытаюсь работать над знаменитыми обеденными философами, и это почти закончено, но мне довольно трудно прерывать темы.
итак, как вы знаете, в этой задаче у нас есть 5 потоков (философов), и пользователь устанавливает время эксперимента, по истечении которого эксперимент закончится.
стоит отметить, что я просмотрел несколько ответов на StackOverflow.
Первый от @Konrad Reiche Как убить поток в Java? /Ссылка на StackOverflow
В этом конкретном посте люди заявили, что использование volatile boolean в качестве флага может сработать, но я боюсь, что в упражнении указано, что я не могу использовать volatile boolean для прерывания потока, но я могу использовать его для других целей. . (учебное упражнение).
Второй - Thread interrupt() не прерывает поток/ссылку Stackoverflow
пока ничего толком не помогло!.
Я постараюсь предоставить необходимый код и надеюсь, что кто-то просто укажет на мою ошибку/ошибки. класс Philosopher является общедоступным и расширяет Thread!.
1) Первая попытка: (может быть отклонена профессором, если он не хочет, чтобы мы использовали volatile boolean в качестве флага!)
при использовании volatile boolean, как это работает:
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());
}
}
}
[ОБНОВЛЕНИЕ] со второй попытки: [РАБОТАЕТ]
замена selfPhilosopher.isInterrupted()
на Thread.currentThread().isInterrupted()
не имела никакого значения, так как selfPhilosopher=this;
тем не менее, я получал «остановится» от метода stopPhilosopher()
, но потоки, похоже, продолжают возвращаться к жизни зомби :(
из-за того, что я вполне убежден мнением @Konrad Reiche из первой предоставленной ссылки и ответом @Nathan Hughes Я буду придерживаться логического флага, предоставленного java isInterrupted()
, вместо использования изменчивого флага.
@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();
}
}
}
ВЫВОД:
Philosopher2 in seat nr: 2 was interrupted from catch clause!..