スレッドの停止とリカバリのいくつかの方法


スレッドの保留とリカバリ方法(1):sleep()方法
この方法は比較的簡単で、どのスレッドが保留する必要があるかは、どのスレッドで直接呼び出すか:Thread.sleep(保留中のミリ秒数);
スレッドの保留とリカバリ方法(2):join()メソッド
マルチスレッドを実装する2つの方法このブログでは、Threadクラスにおけるjoin()の役割を以下のように説明しています.
join():スレッドオブジェクトで呼び出され、あるスレッドAで別のスレッドBのjoinメソッドが呼び出されると、スレッドAはスレッドBの実行が完了してから実行されるのを待つ.
この言葉だけでは特に分からないかもしれませんが、例を示していません.この博文では、この関数の役割を例の形式で紹介します.
まず、次のコードを参照してください.
package com.wrh.threadInterrupt;

public class TestThread implements Runnable{
    private static int num=0;
    public static void main(String[] args) {
        Thread t=new Thread(new TestThread());
        t.start();//       
        System.out.println(num);
    }

    @Override
    public void run() {
        for(int i=0;i<10;i++){
            num++;
        }
    }

}
/*          ? 1 , 2 ,  10 ???    :    。              ,                           main  ,          0;              for        for            main  ,        1~9      。                        main  ,         10.               10 ??       join     ,       。 */

前のコードに加えて、t.join();は出力が必ず10になるようにします.
package com.wrh.threadInterrupt;

public class TestThread implements Runnable{
    private static int num=0;
    public static void main(String[] args) {
        Thread t=new Thread(new TestThread());
        t.start();
        try {
            t.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(num);
    }

    @Override
    public void run() {
        for(int i=0;i<10;i++){
            num++;
        }
    }

}

上の例では、join()メソッドの意味がわかると信じています.プログラムコードに合わせて、この言葉を理解してください.
join():スレッドオブジェクトで呼び出され、あるスレッドAで別のスレッドBのjoinメソッドが呼び出されると、スレッドAはスレッドBの実行が完了してから実行されるのを待つ.すなわち、Aスレッドのコードでb.join()が呼び出されると、スレッドAはスレッドbの実行が完了するまで停止され、実行が継続される.
スレッドの停止とリカバリ方法(3):wait()とnotify()方法
wait()メソッドは同様にスレッドを保留操作することができ、wait()メソッドを呼び出したスレッドは「非実行」状態に入り、wait()メソッドを使用するには2つの方法がある.例えばthread.wait(1000); または:thread.wait(); thread.notify(); ここで、第1の方法は、sleep()メソッドと実質的に同じ方法でスレッドの停止時間を与える.2つ目の方法は、スレッドがnotify()またはnotifyAll()メッセージを受信するまで、wait()をnotify()メソッドと組み合わせて使用することである.
スレッドの停止とリカバリ方法(3):suspend()とresume()メソッド
スレッドにスリープ時間を指定するのではなく、スレッドを強制的に停止する方法がより良い場合があります.この場合、wait()メソッドとnotify()メソッドのほかに、suspend()メソッドとresume()メソッドのペアがこの機能を完了するために使用されます.thread.suspend();thread.resume()は、スレッドthreadがsuspend()に実行された後に強制的に停止され、メインスレッドがthreadを呼び出すまで実行を一時停止する.resume()メソッドの場合にのみ再起動されます.
ただし、Java 2ではsuspend()メソッドとresume()メソッドは廃棄されている.この2つのメソッドを使用するとデッドロックが発生する可能性があるため、suspend()とresume()の代わりにwait()とnotify()を同期オブジェクトで呼び出すメカニズムを使用する必要がある.
suspend()とresume()メソッドによるデッドロックの問題を解決するには、正しい方法は、フラグビットを設定することによって、スレッドを安全な位置に掛けることです.フラグビットの設定方法については、このブログを参照してください.http://blog.csdn.net/ns_code/article/details/17095733