摘要:很多開發人員包括我,尤其是剛進入軟件行業的新手,認為設置線程中斷就是表示線程停止了,不往前執行了,其實不是這樣的,線程中斷只是一個狀態而已,表示已中斷,表示未中斷獲取線程中斷狀態,如果中斷了返回否則返回設置線程中斷不影響線程的繼續執行,但是
? ? 很多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結束"); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/77127.html
摘要:表示一個異步任務的結果,就是向線程池提交一個任務后,它會返回對應的對象。它們分別提供兩個重要的功能阻塞當前線程等待一段時間直到完成或者異常終止取消任務。此時,線程從中返回,然后檢查當前的狀態已經被改變,隨后退出循環。 0 引言 前段時間需要把一個C++的項目port到Java中,因此時隔三年后重新熟悉了下Java。由于需要一個通用的線程池,自然而然就想到了Executors。 用了...
摘要:無限期等待另一個線程執行特定操作。線程安全基本版請說明以及的區別值都不能為空數組結構上,通過數組和鏈表實現。優先考慮響應中斷,而不是響應鎖的普通獲取或重入獲取。只是在最后獲取鎖成功后再把當前線程置為狀態然后再中斷線程。 前段時間在慕課網直播上聽小馬哥面試勸退(面試虐我千百遍,Java 并發真討厭),發現講得東西比自己拿到offer還要高興,于是自己在線下做了一點小筆記,供各位參考。 課...
摘要:同步器的實現根據其狀態是否獨占而有所不同。這個框架為同步狀態的原子性管理線程的阻塞和解除阻塞以及排隊提供了一種通用的機制。在需要使用同步器的目標類中,繼承了的子類要求被聲明為目標類的非公有內部類。類通過一組方法實現線程的阻塞和解除阻塞。 java.util.concurrent.locks包主要是提供線程通信的鎖,下面看一下包中有哪些類。 showImg(https://segment...
摘要:此對象在線程受阻塞時被記錄,以允許監視工具和診斷工具確定線程受阻塞的原因。阻塞當前線程,最長不超過納秒,返回條件在的基礎上增加了超時返回。喚醒線程喚醒處于阻塞狀態的線程。 LockSupport 用法簡介 LockSupport 和 CAS 是Java并發包中很多并發工具控制機制的基礎,它們底層其實都是依賴Unsafe實現。 LockSupport是用來創建鎖和其他同步類的基本線程阻塞...
閱讀 1148·2021-11-23 10:04
閱讀 2407·2021-11-22 15:29
閱讀 2784·2021-11-19 09:40
閱讀 724·2021-09-22 15:26
閱讀 2124·2019-08-29 16:27
閱讀 2492·2019-08-29 16:10
閱讀 1927·2019-08-29 15:43
閱讀 3283·2019-08-29 12:43