当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。
如下代码所示,线程中断了,仍继续执行
public class MyThreadDemo extends Thread{
public static void main(String[] args){
System.out.println("---线程准备中断----");
Thread.currentThread().interrupt();
System.out.println("---线程已经中断,仍然继续执行----");
}
}
执行结果如下:
---线程准备中断----
---线程已经中断,仍然继续执行----
线程中断后,调用sleep()方法,会抛出InterruptedException异常
public class MyThreadDemo extends Thread{
public static void main(String[] args){
System.out.println("---线程准备中断----");
Thread.currentThread().interrupt();
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("---线程已经中断,仍然继续执行----");
}
}
执行结果如下:
---线程准备中断----
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at examples.MyThreadDemo.main(MyThreadDemo.java:10)
---线程已经中断,仍然继续执行----
使用isInterrupted()方法判断中断状态
线程一旦被中断,isInterrupted()方法便会返回true,而一旦sleep()方法抛出异常,它将清空中断标志,此时isInterrupted()方法将返回false。
public class MyThreadDemo extends Thread{
public static void main(String[] args){
System.out.println("---线程准备中断----");
Thread.currentThread().interrupt();
System.out.println("---调用sleep()前,isInterrupted()值为:"+Thread.currentThread().isInterrupted());
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("---调用sleep()后,isInterrupted()值为:"+Thread.currentThread().isInterrupted());
System.out.println("---线程已经中断,仍然继续执行----");
}
}
执行结果如下:
---线程准备中断----
---调用sleep()前,isInterrupted()值为:true
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at examples.MyThreadDemo.main(MyThreadDemo.java:12)
---调用sleep()后,isInterrupted()值为:false
---线程已经中断,仍然继续执行----
使用Thread.interrupted()方法判断中断状态
使用Thread.interrupted()方法来检查当前线程的中断状态,并且如果线程是中断的,线程将改为不中断。又由于它是静态方法,因此不能在特定的线程上使用,而只能报告调用它的线程的中断状态,如果线程被中断,而且中断状态尚不清楚,那么,这个方法返回true。与isInterrupted()不同,它将自动重置中断状态为false,第二次调用Thread.interrupted()方法,总是返回false,除非中断了线程。
public class MyThreadDemo extends Thread{
public static void main(String[] args){
System.out.println("---线程准备中断----");
Thread.currentThread().interrupt();
System.out.println("---Thread.interrupted()值为:"+Thread.interrupted());
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("---Thread.interrupted()值为:"+Thread.interrupted());
}
}
执行结果如下:
---线程准备中断----
---Thread.interrupted()值为:true
---Thread.interrupted()值为:false
join方法用线程对象调用,如果在一个线程A中调用另一个线程B的join方法,线程A将会等待线程B执行完毕后再执行。
yield可以直接用Thread类调用,yield让出CPU执行权给同等级的线程,如果没有相同级别的线程在等待CPU的执行权,则该线程继续执行。