Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

1.11.1 停止不了的线程

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

创建名称为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 正常循环打印50万次

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

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

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


i=331062
i=331063
zzzzzzzz
i=331064
i=331065

图1-38 确认是500001行并且线程未停止

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