一.简介
中断在java中常用的2个方法为interrupt(),isInterrupted()。
- interrupt(),在A线程中调用B线程的interrupt()方法,即会向B线程发出信号——线程中断状态已被设置。至于那个线程何去何从,由具体的代码实现决定。
- isInterrupted(),用来判断当前线程的中断状态(true or false)。
二.使用及注意点
- interrupt()和isInterrupted()的使用
interrupt()不能中断在运行中的线程,它只能改变中断状态而已。
//Runnable接口实现类
class myRunnable implements Runnable
{
public void run() {
while(true){
if(Thread.currentThread().isInterrupted()){
System.out.println("Yes,I am interruted");
return;
}else{
System.out.println("not yet interrupted");
}
}
}
}
//测试类
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread testThread = new Thread(new myRunnable(),"InterruptionInJava");
//start thread
testThread.start();
Thread.sleep(1000);
//interrupt thread
testThread.interrupt();
System.out.println("main end");
}
}
执行结果:
2. 注意点
如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常。且该线程中断标志会被重新置为false。
class myRunnable implements Runnable
{
public void run() {
try {
System.out.println(Thread.currentThread().isInterrupted());
Thread.sleep(10000);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().isInterrupted());
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
Thread testThread = new Thread(new myRunnable(),"InterruptionInJava");
//start thread
testThread.start();
Thread.sleep(1000);
testThread.interrupt();
System.out.println(testThread.getState());
}
}