日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java帐篷_Java多线程之 Park和Unpark(十四)

發(fā)布時(shí)間:2024/9/27 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java帐篷_Java多线程之 Park和Unpark(十四) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

介紹

Park 和 Unpark 均是 LockSupport 類中的方法

//暫停當(dāng)前線程

LockSupport.park();

//恢復(fù)某個(gè)線程

LockSupport.unpark(暫停線程對(duì)象);

先 park 再unpark

Thread thread = new Thread(() -> {

System.out.println("start.....");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("park....");

LockSupport.park();

System.out.println("resume.....");

});

thread.start();

Thread.sleep(2000);

System.out.println("unpark....");

LockSupport.unpark(thread);

運(yùn)行結(jié)果

Connected to the target VM, address: '127.0.0.1:2352', transport: 'socket'

start.....

park....

unpark....

resume.....

注意:

park 中的線程,處于 WAIT 狀態(tài)

unpark 既可以在 park 之前調(diào)用或之后調(diào)用,都是用來恢復(fù)某個(gè)線程的運(yùn)行,簡單的說,調(diào)用 unpark 后再調(diào)用 park 線程依然不會(huì)暫停,類似提前“解毒”。

特點(diǎn)

與 Object 的 wait & notify 相比

wait,notify 和 notifyAll 必須配合 Object Monitor 一起使用,而 unpark 不必

park & unpark 是以線程為單位來【阻塞】和【喚醒】線程,而 notify 只能隨機(jī)喚醒一個(gè)等待線程,notifyAll 是喚醒所以等待線程,就不那么【精確】

park & unpark 可以先 unpark ,而 wait & notify 不能先 notify

原理

每個(gè)線程都有自己的一個(gè) Parker 對(duì)象(C 實(shí)現(xiàn)的),由三部分組成 _counter, _cond, 和 _mutex

舉個(gè)例子,把線程比喻成一個(gè)旅行者, Parker 就是他背著的旅行包,條件變量(_cond) 好比背包中帳篷。_counter 好比背包中的備用干糧( 0 為耗盡, 1 為充足)

調(diào)用 park 就是看線程需不需要停下來休息

若備用干糧耗盡( _counter 為 0) ,則鉆進(jìn)帳篷休息(線程暫停)

若備用干糧充足(_counter 為 1),則不需要停留繼續(xù)前進(jìn) (線程繼續(xù)運(yùn)行)

調(diào)用 unpark ,相當(dāng)于補(bǔ)充干糧(把 _counter 設(shè)置為 1)

如果此時(shí)線程 還在帳篷(先調(diào)用 park) ,則喚醒他繼續(xù)前進(jìn)(線程繼續(xù)運(yùn)行)

如果線程還在運(yùn)行,下次調(diào)用 park 時(shí),僅是消耗備用干糧(把 _counter 設(shè)置為 0) ,不需要停留繼續(xù)前進(jìn)。

如果此時(shí)線程還在運(yùn)行,那么下次他(線程)調(diào)用park時(shí),僅是消耗備用干糧,不需要停留繼續(xù)前進(jìn)

因?yàn)楸嘲臻g有限,多次調(diào)用 unpark 僅會(huì)補(bǔ)充一份備用干糧

詳細(xì)

1)調(diào)用 park

當(dāng)前線程調(diào)用 park() 方法

檢查_counter,本情況為 0 此時(shí)獲得 _mutex 互斥鎖

線程進(jìn)入 _cond 條件變量阻塞

設(shè)置 _counter = 0

2)調(diào)用 unpark

調(diào)用 unpark(Thread_0)方法,設(shè)置 _counter 為 1

喚醒 _cond 條件變量中的 Thread_0 (線程)

Thread_0 恢復(fù)運(yùn)行

設(shè)置 _counter 為 0

3)先調(diào)用 unpark 再調(diào)用 park

調(diào)用 unpark (Thread_0) 方法,設(shè)置_counter 為 1

當(dāng)前線程調(diào)用 park() 方法

檢查 _counter ,本情況為 1 ,這時(shí)線程無需阻塞,繼續(xù)運(yùn)行

設(shè)置 _counter 為 0

總結(jié)

以上是生活随笔為你收集整理的java帐篷_Java多线程之 Park和Unpark(十四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。