1.7.4熟睡中に停止

2510 ワード

スレッドがsleep()状態でスレッドを停止すると、どのような効果が得られますか?
/**
 * MyThread 
 * @author wuyoushan
 * @date 2017/3/21.
 */
public class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        try {
            System.out.println("run begin");
            Thread.sleep(200000);
            System.out.println("run end");
        }catch(InterruptedException e){
            System.out.println(" ! catch!"+this.isInterrupted());
            e.printStackTrace();
        }
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args) {
        try {
            MyThread myThread=new MyThread();
            myThread.start();
            Thread.sleep(200);
            myThread.interrupt();
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
        System.out.println("end");
    }
}


プログラムの実行結果は次のとおりです.
run begin
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at wys.test.MyThread.run(MyThread.java:15)
end
 ! catch!false

出力の結果、sleep状態でスレッドを停止するとcatch文に入り、停止状態値をfalseにする
前の実験ではsleepを先にしてinterrupt()で停止したが,これとは逆の操作はスレッドを学習する際にも注意しなければならない.
/**
 * MyThread 
 * @author wuyoushan
 * @date 2017/3/21.
 */
public class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        try {
            for (int i=0;i<100000;i++){
                System.out.println("i="+(i+1));
            }
            System.out.println("run begin");
            Thread.sleep(200000);
            System.out.println("run end");
        }catch(InterruptedException e){
            System.out.println(" , sleep! catch!");
            e.printStackTrace();
        }
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args) {
        MyThread myThread=new MyThread();
        myThread.start();
        myThread.interrupt();
        System.out.println("end!");
    }
}

実行結果は次のとおりです.
i=99996
i=99997
i=99998
i=99999
i=100000
run begin
 , sleep! catch!
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at wys.test.MyThread.run(MyThread.java:18)

Javaマルチスレッドコアプログラミング技術から抜粋-1.7.4