在多线程中若想中断一个线程T,则需要在其他线程中调T.interrupt()方法。然而这样并不会让线程直接结束,在T线程中我们还需要有判断T是否被中止的代码,其中就有两种返回true与false来标明线程是否被中断过的方法interrupted()和isinterrupted()。
简单说一说他们的区别:
- interrupted()是static的(是类方法),返回的是当前线程的中断标志;isinterrupted()不是static的(是实例对象方法),返回的是滴具体线程的中断标志。这表明,若我们在另外一个线程T_1中调用T.interrupted()方法,将返回T_1的中断标志,而调用T.isinterrupted()方法将返回T的中断标志
- 调用interrupted()判断T是否被中断后会重置T的相应中断标志,而isinterrupted()不会。
例如以interrupted()判断线程是否中断:
现在我们来说一说sleep()方法如何判断线程中止。按我的理解sleep()方法会不断的判断线程是否被中断过,若检测到中断标志则会抛出异常InterruptedEception
class Task implements Runnable{
private double d = 0.0;
public void run() {
try{
while (true) {
for (int i = 0; i < 900000; i++)
d = d + (Math.PI + Math.E) / d;
Thread.sleep(500);
//sleep不断检测中断信号,若有异常则抛出InterruptedException
}
}
catch(InterruptedException e) {
return;
}
}
}
还有课上的一个例子,这个例子中在main函数中开启一个线程t,在该线程中会执行一个work()方法,该方法处于一个while(true)循环中,不断用isInterrupted()方法检测是否被中断,若被中断则调用sleep()方法,这时sleep就会抛出异常(若用Interrupted()方法,则中断标志会被重置,sleep不会抛出异常)