美文网首页
1.7.3能停止的线程——异常法

1.7.3能停止的线程——异常法

作者: 农家男孩 | 来源:发表于2017-06-26 22:34 被阅读0次
/**
 * 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

相关文章

  • 1.7.3能停止的线程——异常法

    程序运行结果: 上面的示例虽然停止了线程,但如果for语句下面还有语句,还是会继续运行的。示例如下: 运行结果如下...

  • 停止线程-异常法

    运行结果(main线程睡眠期间,myThread运行一段时间,然后main线程中将myThread状态标识为tru...

  • 1.7.8使用return停止线程

    将方法interrupt()与return结合使用也能实现停止线程的效果。 运行结果为: 不过还是建议使用“抛异常...

  • 1.7.5能停止的线程——暴力停止

    使用stop()方法停止线程则是非常暴力的。 运行结果为: 摘选自 java多线程核心编程技术-1.7.5

  • C#线程安全及lock使用

    1.首先我们先探讨一下当我们的子线程内部发生异常之后,该线程将会直接停止,确没有将异常抛出,这时我们将会如何处理呢...

  • 多线程_2_停止和暂停

    线程停止 停止线程是在多线程开发时很重要的技术点,掌握线程停止技术可以对线程的停止进行有效的处理。 停止线程的方法...

  • 一个线程运行时发生异常会怎样?

    如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕...

  • Java——一个线程运行时发生异常的处理

    如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕...

  • java并发之守护线程

    java中有两种线程,用户线程和守护线程用户线程:主线程停止时,用户线程不会停止守护线程:主线程停止时,守护线程也...

  • Java多线程核心技术笔记1

    线程停止 判断线程是否停止 测试当前线程是否停止,是指调用该方法的线程是否停止。如果当前状态为已停止,调用该方法返...

网友评论

      本文标题:1.7.3能停止的线程——异常法

      本文链接:https://www.haomeiwen.com/subject/kbbwfxtx.html