很多Java開發人員(包括我),尤其是剛進入軟體行業的新手,認為Java設定執行緒中斷就是表示執行緒停止了,不往前執行了,
Thread.currentThread().interrupt()
其實不是這樣的,執行緒中斷只是一個狀態而已,true表示已中斷,false表示未中斷
//獲取執行緒中斷狀態,如果中斷了返回true,否則返回false
Thread.currentThread().isInterrupted()
設定執行緒中斷不影響執行緒的繼續執行,但是執行緒設定中斷後,執行緒內呼叫了wait、jion、sleep方法中的一種, 立馬丟擲一個 InterruptedException,且中斷標誌被清除,重新設定為false。
class Thread2 implements Runnable{
@Override
public void run() {
try {
System.out.println();
System.out.println(hread.currentThread().isInterrupted());//輸出false
Thread.currentThread().interrupt();//當前執行緒中斷
System.out.println("Thread.currentThread().isInterrupted());//輸出true
Thread.sleep(3000);//中斷後執行sleep會丟擲異常
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("Thread.currentThread().isInterrupted());//輸出false
}
}
}
該如何讓執行緒真正停止不往前執行呢:
真正讓執行緒停止下來(阻塞),Java提供了一個較為底層的併發工具類:LockSupport,該類常用的方法有兩個,1
park(Object blocker) 表示阻塞指定執行緒,引數blocker當前執行緒物件 2 unpark(Thread thread) 喚醒指定執行緒,引數thread指定執行緒物件
示例:
public void test_LockSupport(){
Thread thread=new Thread(new Thread_park());
thread.start();//阻塞當前執行緒
Thread thread2=new Thread(new Thread_unpark(thread));
thread2.start();//喚醒被阻塞的執行緒
}
class Thread_park implements Runnable{
@Override
public void run() {
System.out.println("Thread_park開始");
LockSupport.park(this);//阻塞當前執行緒
System.out.println("Thread_park結束");
}
}
class Thread_unpark implements Runnable{
private Thread thread;
public Thread_unpark(Thread thread) {
this.thread = thread;
}
@Override
public void run() {
System.out.println("Thread_unpark開始");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.unpark(thread);//喚醒被阻塞的執行緒
System.out.println("Thread_unpark結束");
}
}