1.7.3停止できるスレッド——異常法

3624 ワード

/**
 * MyThread 
 * @author wuyoushan
 * @date 2017/3/21.
 */
public class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        for (int i=0;i<500000;i++){
            if(this.interrupted()){
                System.out.println(" ! !");
                break;
            }
            System.out.println("i="+(i+1));
        }
    }
}

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

プログラムの実行結果:

i=274421
i=274422
i=274423
i=274424
i=274425
i=274426
 ! !
end

上記の例では、スレッドは停止していますが、for文の下に文がある場合は、実行を続行します.例は次のとおりです.
/**
 * MyThread 
 * @author wuyoushan
 * @date 2017/3/21.
 */
public class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        for (int i=0;i<500000;i++){
            if(this.interrupted()){
                System.out.println(" ! !");
                break;
            }
            System.out.println("i="+(i+1));
        }
        System.out.println(" , for , !");
    }
}

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

実行結果は次のとおりです。

i=308968
i=308969
i=308970
i=308971
i=308972
i=308973
 ! !
 , for , !
end

では、文の実行を継続する問題をどのように解決すればいいのでしょうか.更新されたコードを見てください.
/**
 * MyThread 
 * @author wuyoushan
 * @date 2017/3/21.
 */
public class MyThread extends Thread {

    @Override
    public void run() {
        super.run();
        try {
            for (int i = 0; i < 500000; i++) {
                if (this.interrupted()) {
                    System.out.println(" ! !");
                    // 
                    throw new InterruptedException();
                }
                System.out.println("i=" + (i + 1));
            }
            System.out.println(" for ");
        }catch(InterruptedException e){
            System.out.println(" MyThread.java run catch !");
            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(2000);
            myThread.interrupt();
        } catch (InterruptedException e) {
            System.out.println("main catch");
            e.printStackTrace();
        }
        System.out.println("end");
    }
}


実行結果は次のとおりです.
i=162100
i=162101
i=162102
i=162103
i=162104
i=162105
i=162106
 ! !
 MyThread.java run catch !
end
java.lang.InterruptedException
    at wys.test.MyThread.run(MyThread.java:18)


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