《Java多线程编程核心技术(第2版)》 —1.11 停止线程

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

1.11 停止线程

停止线程是多线程开发的一个很重要的技术点,掌握此技术可以对线程的停止进行有效的处理,停止线程在Java语言中并不像break语句那样干脆,还需要一些技巧性的处理。

使用Java内置支持多线程的类去设计多线程应用是很常见的事情,然而多线程给开发人员带来了一些新的挑战,如果处理不好就会导致超出预期的行为及难于定位的错误。

本节将讨论如何更好地停止一个线程。停止一个线程意味着在线程处理完任务之前停止正在做的操作,也就是放弃当前的操作,虽然这看起来非常简单,但是必须做好防范措施,以便达到预期的效果。停止一个线程可以使用Thread.stop()方法,但不推荐使用此方法,虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是被弃用作废的,意味着在将来的Java版本中,这个方法将不可用或不被支持。

大多数情况下,停止一个线程使用Thread.interrupt()方法,但这个方法不会终止一个正在运行的线程,还需要加入一个判断才可以完成线程的停止。关于此知识点,后面有专门的章节对其进行介绍,这里不再赘述。

在Java中有3种方法可以使正在运行的线程终止运行:

1)使用退出标志使线程正常退出。

2)使用stop()方法强行终止线程,但是这个方法不推荐使用,因为stop()和suspend()、resume()一样,都是作废过期的方法,使用它们可能发生不可预料的结果。

3)使用interrupt()方法中断线程。

这3种方法会在后面的章节进行介绍。

1.11.1 停止不了的线程

本示例将调用interrupt()方法来停止线程,但interrupt()方法的使用效果并不像for+break语句那样,马上就停止循环。调用interrupt()方法仅仅是在当前线程中做了一个停止的标记,并不是真正停止线程。

创建名称为t11的项目,文件MyThread.java代码如下:

public class MyThread extends Thread {

    @Override

    public void run() {

        super.run();

        for (int i = 0; i < 500000; i++) {

            System.out.println("i=" + (i + 1));

        }

    }

}

运行类Run.java代码如下:

package test;

 

import exthread.MyThread;

 

public class Run {

    public static void main(String[] args) throws InterruptedException {

        MyThread thread = new MyThread();

        thread.start();

        Thread.sleep(2000);

        thread.interrupt();

        System.out.println("zzzzzzzz");

    }

}

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

把Eclipse软件中的控制台的日志复制到文本编辑器软件中,显示的行数是500001行,如图1-38所示。

 image.png

在331063行处输出了zzzzzzzz,说明sleep时间为2s时,for语句执行了331063次循环,日志如下:

i=331062

i=331063

zzzzzzzz

i=331064

i=331065

从运行结果来看,调用interrupt()方法并没有将线程停止,那如何停止线程呢?


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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