協力してこそ、より良い中断スレッドができます。

3189 ワード

話が中断されると、みんなが一番よく知っている例はスレッド休眠です。以下は、スレッドが休止しているデモであり、この例では、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つの方法がスレッドに関連している。
  • サードヘッド
  • Thread菵interrupted
  • thread菵isInterrupted
  • 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で始まる。
    私の公衆番号に注目してください。手続きがよくできて、日常の干物の配達ができます。私のテーマの内容に興味があれば、私のブログにも注目してください。