私は有名な食事する哲学者で動作するようにしようとし、そのかなりの完成が、私はかなり苦労割り込みスレッドにしようとしたんですよ。
あなたはこの問題に知っているように、我々は5つのスレッド(哲学者)と、ユーザは、実験が終了するときの実験時間を設定しています。
私はStackOverflowの上で複数の回答を見ていることの価値が気付か。
一つ目は@KonradライヒェからであるあなたはJavaでスレッドを殺すにはどうすればよいですか?/ stackoverflowのリンク
その特定の記事の中で、人々はフラグとして揮発性のブール値を使用してワークアウトかもしれないと述べたが、私は私がスレッドを中断する揮発性のブール値を使用傾けること行使紙に記載されていることを恐れているが、私は他の目的のためにそれを使用することができます。(運動を研究)。
二つ目は、あるスレッド割り込み()ない割り込みスレッド/ StackOverflowのリンクを行います
まだ何も本当に助けません!
私は、必要なコードを提供しようとすると、私は誰かがちょうど私のミス/秒を指摘するだろう願っています。クラス哲学者は、パブリックで、スレッドを拡張します!
1)最初の試み:彼は私たちがフラグとして揮発性のブール値を使用したくない場合は(教授によって拒否される可能性があります)!
このような揮発性のブール値を使用している場合、それは動作します:
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]:[WORKING]
交換selfPhilosopher.isInterrupted()
では、Thread.currentThread().isInterrupted()
どのような違いはありませんでしたselfPhilosopher=this;
まだ私はから「停止します」になっていたstopPhilosopher()
方法が、スレッドはゾンビが生活に戻って来続けるようであるように見える:(
私はかなりの意見に納得だという事実による最初の参照から@Konradライヒェ提供と@Nathanヒューズ私の答えは、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!..
例外:InterruptedExceptionがスローされると、割り込みフラグがクリアされます。手段は、次のチェックあなたのループになり、スレッドが中断していないと表示され、スレッドが実行を続けるということ。それはあなたが最終的に割り込みフラグのために偽の外にプリントをブロックしたときに、あなたが見ているものです。
これはで説明された休眠方法のためのAPIドキュメント:
例外:InterruptedException - いずれかのスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの割り込みステータスはクリアされます。
あなたが例外:InterruptedExceptionをキャッチブロックに次の行を追加します。
Thread.currentThread().interrupt(); // restores interrupt flag