日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

教你如何使用Java多線程編程LockSupport工具類

瀏覽:125日期:2022-08-14 13:43:16
LockSupport類

用于創建鎖和其他同步類的基本線程阻塞原語,此類與使用它的每個線程關聯一個許可。如果獲得許可,將立即返回對park的調用,并在此過程中消耗掉它;否則may會被阻止。調用unpark可使許可證可用(如果尚不可用)。(不過與信號量不同,許可證不會累積。最多只能有一個。)方法park和unpark提供了有效的阻塞和解阻塞線程的方法,這些線程不會遇到導致已棄用的方法Thread.suspend和Thread.resume無法用于以下問題:由于許可,在調用park的一個線程與試圖進行unpark的另一個線程之間的競爭將保留生命力。此外,如果調用者的線程被中斷并且支持超時版本,則park將返回。 park方法也可能在其他任何時間出于“無理由”返回,因此通常必須在循環中調用該循環,該循環在返回時會重新檢查條件。從這個意義上說,park是對“繁忙等待”的優化,它不會浪費太多的時間,而必須與unpark配對才能生效。了解了其作用,我們看看相關API。

LockSupport.park()

park():除非有許可,否則出于線程調度目的禁用當前線程。如果許可證可用,則將其消耗掉,并立即返回呼叫;否則,將立即返回該呼叫。出于線程調度的目的,當前線程將被禁用,并處于休眠狀態,直到發生以下三種情況之一:1.其他一些線程以當前線程為目標調用unpark()方法2.其他一些線程Threadinterrupt interrupts當前線程3.虛假地調用返回源碼:

public static void park() { UNSAFE.park(false, 0L);}

LockSupport都是調用的UNSAFE的方法,我們先看看park方法

public class LockSupportMain { public static void main(String[] args) {System.out.println('begin park!');LockSupport.park();System.out.println('end park!'); }}

運行結果:

教你如何使用Java多線程編程LockSupport工具類

我們調用了park方法,導致Main線程一直被阻塞,一直沒有結束,因為默認的情況下,調用線程是不持有許可證的,我們如何解決呢?上面提到過三個方式,我們一個一個的驗證。

1.調用unpack方法獲得許可

unpack():如果給定線程尚不可用,則使它可用。如果線程在park上被阻止,則它將取消阻止。否則,將確保其對park的下一次調用不會阻塞。如果給定線程尚未啟動,則不能保證此操作完全無效。源碼:

public static void unpark(Thread thread) { if (thread != null)UNSAFE.unpark(thread);}

public class LockSupportMain2 { public static void main(String[] args) {System.out.println('begin park!');LockSupport.unpark(Thread.currentThread());LockSupport.park();System.out.println('end park!'); }}

運行結果:

教你如何使用Java多線程編程LockSupport工具類

可以看出,當前的線程main已經釋放了,沒有進行阻塞,直接運行完成了。我們創建一個線程有Main線程進行unpark方法將線程在阻塞的情況下,進行運行。

public class LockSupportMain3 { public static void main(String[] args) throws InterruptedException {Runnable runnable = new Runnable() { @Override public void run() {System.out.println('begin start thread name: ' + Thread.currentThread().getName() + ' park');LockSupport.park();System.out.println('end start thread name: ' + Thread.currentThread().getName() + ' park'); }};Thread thread = new Thread(runnable);thread.start();Thread.sleep(2000);System.out.println('main thread call unpark');LockSupport.unpark(thread); }}

運行結果:

教你如何使用Java多線程編程LockSupport工具類

運行結果可以看出,其他一些線程以當前線程為目標調用unpark()方法可以將線程的park導致阻塞的繼續運行。

2.調用中斷interrupts方法獲得許可

由于park方法不會告訴你何種原因返回,所以調用者需要根據之前調用park方法的原因,再次檢查條件是否滿足,如果不能滿足,就還需要調用park方法

public class LockSupportMain4 { public static void main(String[] args) throws InterruptedException {Runnable runnable = new Runnable() { @Override public void run() {System.out.println('begin start thread name: ' + Thread.currentThread().getName() + ' park');while (!Thread.currentThread().isInterrupted()) { LockSupport.park();}System.out.println('end start thread name: ' + Thread.currentThread().getName() + ' park'); }};Thread thread = new Thread(runnable);thread.start();Thread.sleep(2000);//通過interrupt方法 讓park阻塞繼續運行thread.interrupt(); }}

運行結果:

教你如何使用Java多線程編程LockSupport工具類

由運行可以看出,其他一些線程Threadinterrupt interrupts當前線程是可以將park阻塞的線程繼續運行。

parkNanos(long nanos)

parkNanos(long nanos):除非允許使用許可,否則在指定的等待時間內禁用用于線程調度的當前線程。源碼:

public static void parkNanos(long nanos) { if (nanos > 0)UNSAFE.park(false, nanos);}

public class LockSupportMain5 { public static void main(String[] args) throws InterruptedException {Runnable runnable = new Runnable() { @Override public void run() {System.out.println('begin start thread name: ' + Thread.currentThread().getName() + ' park');LockSupport.parkNanos(3_000_000_000L);System.out.println('end start thread name: ' + Thread.currentThread().getName() + ' park'); }};Thread thread = new Thread(runnable);thread.start(); }}

運行結果:

教你如何使用Java多線程編程LockSupport工具類

三秒之后,阻塞三秒之后繼續運行。

park(Object blocker)

park(Object blocker):除非有許可,否則出于線程調度目的禁用當前線程源碼:

public static void park(Object blocker) { Thread t = Thread.currentThread(); setBlocker(t, blocker); UNSAFE.park(false, 0L); setBlocker(t, null);}

這里的blocker對象是Thread類中的blocker對象,代碼如下:

//提供給java.util.concurrent.locks.LockSupport.park的當前調用的參數。//由(私有)java.util.concurrent.locks.LockSupport.setBlocker設置使用//java.util.concurrent.locks.LockSupport.getBlocker進行訪問volatile Object parkBlocker;parkNanos(Object blocker, long nanos)

源碼:

public static void parkNanos(Object blocker, long nanos) { if (nanos > 0) {Thread t = Thread.currentThread();setBlocker(t, blocker);UNSAFE.park(false, nanos);setBlocker(t, null); }}parkUntil(Object blocker, long deadline)

parkUntil(Object blocker, long deadline):除非指定許可,否則禁用當前線程以進行線程調度,直到指定的期限。源碼:

public static void parkUntil(Object blocker, long deadline) { Thread t = Thread.currentThread(); setBlocker(t, blocker); UNSAFE.park(true, deadline); setBlocker(t, null);}

我們使用java API中的例子看看:

public class LockSupportMain6 { private final AtomicBoolean locked = new AtomicBoolean(false); private final Queue<Thread> waiters = new ConcurrentLinkedQueue<Thread>(); public void lock() {boolean wasInterrupted = false;Thread current = Thread.currentThread();waiters.add(current);// 不在隊列中時先阻塞或無法獲取鎖定while (waiters.peek() != current ||!locked.compareAndSet(false, true)) { LockSupport.park(this); // 等待時忽略中斷 如果park方法是因為被中斷而返回,則忽略中斷,并且重新設置中斷標記,做個標記 if (Thread.interrupted()) {wasInterrupted = true; }}waiters.remove();// 退出時重新聲明中斷狀態if (wasInterrupted) { current.interrupt();} } public void unlock() {locked.set(false);LockSupport.unpark(waiters.peek()); }}

有blocker的可以傳遞給開發人員更多的現場信息,可以查看到當前線程的阻塞對象,方便定位問題

到此這篇關于教你如何使用Java多線程編程-LockSupport工具類的文章就介紹到這了,更多相關使用java的LockSupport工具類內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品国产www456c0m| 香蕉久久国产| 狠狠干成人综合网| 久久中文视频| 亚洲精品网址| 亚洲一级黄色| 国产亚洲激情| 国产亚洲网站| 天堂va欧美ⅴa亚洲va一国产| 国产精品嫩草99av在线| 亚洲狼人精品一区二区三区| 91国内精品| 国产精品sss在线观看av| 电影天堂国产精品| 日韩在线高清| 亚洲免费观看| 丝袜a∨在线一区二区三区不卡| 亚洲成人三区| 亚洲激情中文在线| 香蕉久久一区| 精品久久精品| 视频一区中文| 久久国产三级精品| 欧美日韩中文一区二区| 69精品国产久热在线观看| 国产欧美一区二区三区精品酒店| 欧美日韩色图| 中文字幕一区二区三区四区久久 | 日本免费在线视频不卡一不卡二| 青青草国产精品亚洲专区无| 亚洲精品88| 亚洲精品福利| 99久久久国产精品美女| 美腿丝袜在线亚洲一区| 亚洲视频国产精品| 国产调教精品| 中文亚洲免费| 国产一区二区三区天码| 国产视频网站一区二区三区| 99国产精品自拍| 国产精品毛片视频| 美女国产精品| 精品国产鲁一鲁****| 国产精品欧美三级在线观看| 久久成人国产| 日韩亚洲一区在线| 国产精品久久久久久妇女| 国产精品网址| 石原莉奈在线亚洲二区| 乱人伦精品视频在线观看| 在线亚洲精品| 成人羞羞在线观看网站| 成人国产精品一区二区免费麻豆| 综合日韩在线| 日韩毛片视频| 蜜桃精品在线| 国产在线视频欧美一区| 亚洲黄色网址| 国产一区二区三区不卡视频网站| 久久久久亚洲精品中文字幕| 国产精品**亚洲精品| 久久久久久色 | 动漫av一区| 日韩不卡一区二区三区| 日韩欧美高清一区二区三区| 亚洲专区视频| 久久午夜视频| 中文字幕乱码亚洲无线精品一区| 最近国产精品视频| 91精品91| 日韩精品一二区| 亚洲精品乱码日韩| 欧美日韩黄网站| 麻豆精品在线观看| 神马久久午夜| 黄色精品网站| 亚州av日韩av| 久久精品国产网站| 美女视频黄 久久| 日韩视频网站在线观看| 综合激情一区| 欧美日韩99| 精品精品国产三级a∨在线| 亚洲少妇在线| 首页国产欧美久久| 国产免费av一区二区三区| 亚洲第一区色| 视频在线在亚洲| 欧美1区2区3| 亚洲午夜电影| 日韩1区2区3区| 日韩欧美国产精品综合嫩v| 色综合视频一区二区三区日韩| 影音先锋久久精品| 国产视频一区二| 99久久久久国产精品| 日韩av一区二| 亚洲www啪成人一区二区| 国产精品主播在线观看| 亚洲黄页一区| 欧美日本久久| 亚洲精品国产偷自在线观看| 日本一二区不卡| 免费在线观看一区二区三区| 日韩在线观看| 欧美天堂在线| 午夜在线播放视频欧美| 性欧美69xoxoxoxo| 国产精品久久久久久久久久久久久久久| 国语精品一区| 亚洲欧洲专区| 久久国产亚洲| 国产成人在线中文字幕| 国产一区二区三区探花| 国产精品22p| 视频一区二区三区中文字幕| 红桃视频国产一区| 成人在线免费观看网站| 成人国产精品久久| 国产亚洲高清一区| 四虎精品永久免费| 久色成人在线| 亚洲小说欧美另类婷婷| 蜜臀av免费一区二区三区| 精品捆绑调教一区二区三区 | 国产盗摄——sm在线视频| 国产精品xxx在线观看| 欧美激情aⅴ一区二区三区| 久久国产精品免费一区二区三区| 亚洲精一区二区三区| 亚洲日本久久| 亚洲激情二区| 久久成人一区| 日韩精品国产欧美| 热久久久久久| 麻豆国产精品| 国产中文字幕一区二区三区| 日韩一区欧美| 蜜桃精品在线| 99香蕉国产精品偷在线观看| 日韩激情精品| 97se亚洲| 精品三级av| 亚洲二区在线| 综合激情五月婷婷| 国产精品自在| 色在线中文字幕| 欧美日韩日本国产亚洲在线 | 日韩午夜av在线| 亚洲精品极品少妇16p| 麻豆精品少妇| 91免费精品| 丝袜诱惑制服诱惑色一区在线观看 | 久久在线电影| 九一成人免费视频| 亚洲综合小说| 国产激情综合| 欧美1区免费| 国产九一精品| 图片区亚洲欧美小说区| 成人黄色av| 影视先锋久久| 91精品尤物| 91精品成人| 精品国产aⅴ| 四虎成人av| 精品中文字幕一区二区三区四区| 国产精品91一区二区三区| 欧美日韩亚洲一区| 日韩久久精品网| 爽好久久久欧美精品| 国产真实久久| 国产欧美激情| 亚洲一区二区三区四区五区午夜| 精品网站aaa| 久久国产成人| 日韩欧美网址| 国产精品一国产精品| 91成人精品在线| 偷拍欧美精品| 精品视频网站| 国产精品亚洲成在人线| 国产精品视频首页| 性欧美长视频| 日韩精品永久网址| 日韩av字幕| 亚洲一区欧美二区| 欧美gv在线| 蜜臀国产一区| 国产一区日韩| 色综合五月天| 久久99高清| 久久97久久97精品免视看秋霞| 久久成人av| 日本欧美久久久久免费播放网| 欧美一区91| 91精品美女| 日韩美女精品| 国产日产高清欧美一区二区三区 | 丝袜亚洲精品中文字幕一区|