協力してこそ、より良い中断スレッドができます。
3189 ワード
話が中断されると、みんなが一番よく知っている例はスレッド休眠です。以下は、スレッドが休止しているデモであり、この例では、サードヘッド Thread菵interrupted thread菵isInterrupted
以下は
アンペア
interrupt is an indication to a thread that it shound stop what it is dong and do something else.It's up to the programmer to decide exactly how a thread read ponds to an interrupt,but it is command for minerto
中断はこのスレッドが停止できることを示すだけですが、スレッドが停止するかどうかは完全にスレッド自体に依存します。スレッドが互いに協力してこそ、スレッドをよりよく停止することができる。
各スレッドは、中断状態を表す内部フラグを含んでいます。スレッドを呼び出した
私たちは
上記の方法は中断状態判断を加えるだけでスレッドを停止することができます。
むやみに食べないでください。
中断異常はchecked exceptionですので、この異常を処理しなければなりません。もしこの異常が適用に影響しないことを保証できたら、私達は直接に『食べます』という異常ができます。他の状況ではこの異常を正しく処理する必要があります。
最も簡単な方法はこの異常を処理しないで、直接上に向かって中断の異常を投げて、上層の調合者にどのように処理するかを決定させます。
しかし、いくつかの場合、上記の方法には適していません。この場合、私たちはcatchで処理を中断する必要があります。どのように処理したらいいか分かりません。異常を記録してログで出力します。
中断はIOブロックを停止しません。
上記で述べたように、いくつかの閉塞方法については、
これは、
この文章はstudyidea.cnで始まる。
私の公衆番号に注目してください。手続きがよくできて、日常の干物の配達ができます。私のテーマの内容に興味があれば、私のブログにも注目してください。
sleep
方法を呼び出すと、この方法はキャプチャを必要とする中断異常をスローし、ここで異常を捕捉し、直接に戻る。 for (int i = 0; i < somethings.size(); i++) {
// 4 s
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
//
return;
}
//
System.out.println(somethings.get(i));
}
InterruptedException
が異常を中断しているほか、3つの方法がスレッドに関連している。interrupt
方法はスレッドを中断するために用いられるが、この方法が直接スレッドを停止させるというわけではない。以下は
interrupt
を用いてスレッドを中断し、ここではサブスレッド出力の直接停止を期待する。しかし、メインスレッドがサブスレッドinterrupt
方式を起動すると、サブスレッドは終了されておらず、まだ数字が印刷され続けている。 Runnable interruptedTask=new Runnable() {
@Override
public void run() {
for (int i = 0; i
Java公式の中断についての説明を参照してください。アンペア
interrupt is an indication to a thread that it shound stop what it is dong and do something else.It's up to the programmer to decide exactly how a thread read ponds to an interrupt,but it is command for minerto
中断はこのスレッドが停止できることを示すだけですが、スレッドが停止するかどうかは完全にスレッド自体に依存します。スレッドが互いに協力してこそ、スレッドをよりよく停止することができる。
各スレッドは、中断状態を表す内部フラグを含んでいます。スレッドを呼び出した
interrupt
方法は、状態ビットを設定し、Thread#sleep
などのブロッキング方法については、InterruptedException
を投げ、割り込みフラグをクリアする。私たちは
thread#isInterrupted
またはThread#interrupted
を使用して中断状態を確認することができます。しかし、2つの方法にはいくつかの違いがあり、Thread#interrupted
は静的な方法であり、この方法は中断を検出すると中断フラグをクリアすることができる。上記の方法は中断状態判断を加えるだけでスレッドを停止することができます。
Runnable interruptedTask=new Runnable() {
@Override
public void run() {
for (int i = 0; i
最適な実践を中断するむやみに食べないでください。
中断異常はchecked exceptionですので、この異常を処理しなければなりません。もしこの異常が適用に影響しないことを保証できたら、私達は直接に『食べます』という異常ができます。他の状況ではこの異常を正しく処理する必要があります。
最も簡単な方法はこの異常を処理しないで、直接上に向かって中断の異常を投げて、上層の調合者にどのように処理するかを決定させます。
しかし、いくつかの場合、上記の方法には適していません。この場合、私たちはcatchで処理を中断する必要があります。どのように処理したらいいか分かりません。異常を記録してログで出力します。
中断はIOブロックを停止しません。
上記で述べたように、いくつかの閉塞方法については、
Thread#sleep
のように、割り込み異常が発生します。しかし、ソケットなどのIO呼び出しブロックに対しては、この異常は投げられません。つまり、中断はIOの呼び出しを止めることができません。これは、
Thread#sleep
などのブロッキング方法を呼び出すと、Javaスレッド状態がRUNNABLE
からTIMED_WAITING
またはWATTING
に遷移するからである。スレッドがIOでブロックされると、Javaスレッドの実際の状態はまだRUNNABLE
です。このスレッドの状態に疑問があるなら、この記事を読んでください。面接官:I/Oモデルをブロックするとスレッドが休止すると言っていますが、なぜJavaスレッドの状態はRUNNALEですか?スレッド状態を深く理解してください。この文章はstudyidea.cnで始まる。
私の公衆番号に注目してください。手続きがよくできて、日常の干物の配達ができます。私のテーマの内容に興味があれば、私のブログにも注目してください。