《Java多线程编程核心技术(第2版)》 —1.11 停止线程
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所示。
在331063行处输出了zzzzzzzz,说明sleep时间为2s时,for语句执行了331063次循环,日志如下:
i=331062
i=331063
zzzzzzzz
i=331064
i=331065
从运行结果来看,调用interrupt()方法并没有将线程停止,那如何停止线程呢?
- 点赞
- 收藏
- 关注作者
评论(0)