java 中断线程 wait_Java 线程中断(interrupt)与阻塞 (park)的区别
很多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結束");
}
}
總結
以上是生活随笔為你收集整理的java 中断线程 wait_Java 线程中断(interrupt)与阻塞 (park)的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 自助更改密码 api_搭建ld
- 下一篇: java解非线性方程组_Scipy -