停止线程是多线程中的一个技术点,Thread类的方法中,与停止线程有关的是: interrupt(),interrupted()和isInterrupted(),
仅从名字上看就能感受到区分它们是有难度的T.T,还有一个stop()方法,该方法因”unsafe”而被标记为”Deprecated”,
本博客主要是对这三个方法区别的介绍,不会涉及到被弃用的方法,希望在正确有效的停止线程的路上有一点进步。
1. 函数定义
根据Java api,这三个方法的定义如下:
public void interrupt(): Interrupts this thread.
public static boolean interrupted(): Tests whether the current thread has been interrupted.
public boolean isInterrupted(): Tests whether this thread has been interrupted.
首先定义上,对这三个方法就有直观的认识,可以发现,最容易混淆的两个方法是:interrupted()和isInterrupted()
:
- interrupted()是一个静态方法:检测当前线程是否已经中断;
- isInterrupted():检测该线程是否已经中断。
也正如此,它们本质才是不同的,下面是根据Java api中对这三个方法的详细说明,对它们进行的详细解释。
2. interrupt()
尽管看上去是该方法是用于中断线程的,但是实质上,它的使用效果并不会停止一个正在运行的线程,
仅仅是在线程中打了一个停止的标记而已,需要加入一个判断才实现停止线程的功能。
关于如何停止线程,可以参考:多线程——停止线程
实例代码:
/*
* 测试interrupt()方法
*/
public class Test_interrupt implements Runnable {
@Override
public void run() {
for(int i=0; i<500000; i++){
System.out.println("i=: "+i);