《Java多线程编程核心技术(第2版)》 —1.11.4 在sleep状态下停止线程

举报
华章计算机 发表于 2020/02/08 15:13:43 2020/02/08
【摘要】 本节书摘来自华章计算机《Java多线程编程核心技术(第2版)》 一书中第1章,第1.11.4节,作者是高洪岩。

1.11.4 在sleep状态下停止线程

如果线程在sleep状态下,则停止线程会是什么效果呢?

新建项目t14,类MyThread.java代码如下:

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();

        }

    }

}

文件Run.java代码如下:

public class Run {

 

    public static void main(String[] args) {

        try {

            MyThread thread = new MyThread();

            thread.start();

            Thread.sleep(200);

            thread.interrupt();

        } catch (InterruptedException e) {

            System.out.println("main catch");

            e.printStackTrace();

        }

        System.out.println("end!");

    }

 

}

程序运行效果如图1-47所示。

 image.png

图1-47 程序运行结果

从运行结果来看,如果线程在sleep状态下停止,则该线程会进入catch语句,并且清除停止状态值,变成false。

标例是先调用sleep()方法,再调用interrupt()方法停止线程,还有一个反操作在学习线程时也要注意,即先调用interrupt()方法,再调用sleep()方法,这种情况下也会出现异常。

新建项目t15,类MyThread.java代码如下:

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();

        }

    }

}

类Run.java代码如下:

public class Run {

    public static void main(String[] args) {

        MyThread thread = new MyThread();

        thread.start();

        thread.interrupt();

        System.out.println("end!");

    }

}

程序运行结果如图1-48所示。

 image.png

图1-48 输出“end!”说明interrupt()方法先执行

控制台最下面的输出如图1-49所示。

 image.png

图1-49 执行interrupt()方法停止后遇到sleep()方法报异常

不管其调用的顺序,只要interrupt()和sleep()方法碰到一起就会出现异常:

1)在sleep状态执行interrupt()方法会出现异常;

2)调用interrupt()方法给线程打了中断的标记,再执行sleep()方法也会出现异常。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。