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

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

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

瀏覽:130日期: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久久,三上悠亚国产精品一区二区三区
亚洲精品系列| 日韩毛片在线| 久久国产小视频| 五月天久久777| 夜夜嗨av一区二区三区网站四季av| 色88888久久久久久影院| 蜜桃视频第一区免费观看| 在线亚洲自拍| 日韩精品一级中文字幕精品视频免费观看 | 香蕉精品视频在线观看| 欧美日韩水蜜桃| 欧美1区2区3| 欧美精品羞羞答答| 丝袜美腿成人在线| 国产精品对白久久久久粗| japanese国产精品| 99久久99久久精品国产片果冰| 免费成人在线视频观看| 久久国产三级| 欧美日韩国产高清电影| 综合激情在线| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美日本久久| 久久亚洲在线| 日本少妇精品亚洲第一区| 女人av一区| 亚洲精品无吗| 老牛影视精品| 国产伦精品一区二区三区在线播放 | 国产视频欧美| 国产精品久久乐| 久久美女精品| 国产精品一区二区av日韩在线| 亚洲www啪成人一区二区| 亚洲三级视频| 日本综合字幕| 国产情侣久久| 在线一区视频观看| 日韩中文字幕| 久久精品亚洲欧美日韩精品中文字幕| 最新亚洲国产| 久久毛片亚洲| 欧美欧美黄在线二区| re久久精品视频| 国产伊人久久| 精品视频在线你懂得| 国产精品久久久久久模特| 蜜臀久久精品| 国产精品久久久久久久久久白浆 | 91精品国产自产观看在线| 韩国精品主播一区二区在线观看| 在线日韩成人| 久久伦理在线| 91亚洲国产高清| 日韩成人午夜精品| 欧美日韩国产亚洲一区| 一区二区自拍| 久久精品五月| 日韩综合一区二区三区| av一区二区高清| 久久精品九色| 日韩av电影一区| 久久亚洲风情| 日韩精品乱码av一区二区| 日韩精品亚洲一区二区三区免费| 日本蜜桃在线观看视频| 国产精品天堂蜜av在线播放| 三级一区在线视频先锋| 国产99精品| 亚洲一区二区三区高清不卡| 久久精品中文| 丝袜诱惑一区二区| 精品久久网站| 国产精品男女| 日韩精品免费视频一区二区三区| 欧美不卡视频| 日本蜜桃在线观看视频| 精品国产网站| 久久久国产精品网站| 97久久精品| 亚洲专区视频| 丝瓜av网站精品一区二区| 欧美日韩一二三四| 美女福利一区二区三区| 成人黄色av| 免费毛片在线不卡| 性欧美videohd高精| 日韩av自拍| 精品国产精品久久一区免费式| 欧美视频一区| 亚洲精品自拍| 男人的天堂久久精品| 先锋亚洲精品| 蜜臀av一区二区在线免费观看| 午夜日韩av| 99国产精品| 9色国产精品| 日韩一级欧洲| 视频一区二区三区在线| 亚洲人成高清| 日韩高清不卡一区| 国产精品一区毛片| 久久不卡日韩美女| 免费在线观看一区| 国产成人黄色| 精品美女视频| 日韩激情一区| 欧美一级精品| 亚洲欧美日本视频在线观看| 亚洲一区免费| 亚洲精品字幕| 国产欧美一区二区三区精品观看| 久久精品国产成人一区二区三区| 国产欧洲在线| 国产综合精品| 免费看欧美美女黄的网站| 午夜天堂精品久久久久| 国产香蕉精品| 国产精品成人a在线观看| 99国产精品一区二区| 免费视频国产一区| 亚洲免费成人av在线| 国产亚洲精品美女久久久久久久久久| 欧美a一区二区| 青青青免费在线视频| 精品一区在线| 日韩午夜视频在线| 久久久国产精品入口麻豆| 超碰在线99| 亚洲精品1区2区| 亚州欧美在线| 国产极品嫩模在线观看91精品| 国产一区二区三区四区大秀| 久久精品国产亚洲夜色av网站 | 国产精品网址| 亚洲伦乱视频| 亚洲另类av| 国产精品片aa在线观看| 亚洲欧美日韩国产一区二区| 欧美亚洲自偷自偷| 日韩a一区二区| 国精品一区二区| 日本午夜精品久久久久| 国产精品成人a在线观看| 夜夜精品视频| 国产日本久久| 激情视频网站在线播放色 | 亚洲国产成人精品女人| 亚洲毛片视频| 福利在线免费视频| 亚洲免费网址| 精品久久亚洲| 久久亚洲国产精品一区二区| 国产精品久久久久77777丨| 99视频精品全国免费| 日韩不卡一区二区三区| 天堂中文在线播放| 亚洲欧美专区| 日韩88av| 亚洲精品日本| 中文字幕成在线观看| 在线一区视频| 国产美女撒尿一区二区| 欧美亚洲激情| 国产精品白浆| 久久av在线| 水蜜桃精品av一区二区| 影音先锋久久精品| 亚洲免费福利| 久久国产免费看| 午夜一区在线| 亚洲www啪成人一区二区| 国产欧美亚洲一区| 麻豆精品网站| 日韩欧美视频专区| 国产美女久久| 三级亚洲高清视频| 色一区二区三区四区| 亚洲精品少妇| 久久人人97超碰国产公开结果| 日韩精品亚洲专区| 在线一区电影| 成人免费一区| 日韩va亚洲va欧美va久久| 精品久久免费| 欧美久久香蕉| 精品一区欧美| 一区二区三区四区在线看| 麻豆亚洲精品| 日韩视频中文| 亚洲欧美日韩精品一区二区| 精品一区视频| 欧美黑人巨大videos精品| 视频一区视频二区中文字幕| 久久中文欧美| 丝袜a∨在线一区二区三区不卡| 久久久久黄色| 天使萌一区二区三区免费观看| 精品国产一区二区三区2021| 99国产精品久久久久久久成人热|