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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

java 多线程 信号_Java多线程——Semaphore信号灯

發(fā)布時(shí)間:2023/11/27 生活经验 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 多线程 信号_Java多线程——Semaphore信号灯 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Semaphore [?sem?f??r]可以維護(hù)當(dāng)前訪問自身的線程個(gè)數(shù),并提供了同步機(jī)制。使用Semaphore可以控制同時(shí)訪問資源的線程個(gè)數(shù)(即允許n個(gè)任務(wù)同時(shí)訪問這個(gè)資源),例如,實(shí)現(xiàn)一個(gè)文件允許的并發(fā)訪問數(shù)。

Semaphore實(shí)現(xiàn)的功能就類似廁所有5個(gè)坑,假如有十個(gè)人要上廁所,那么同時(shí)能有多少個(gè)人去上廁所呢?同時(shí)只能有5個(gè)人能夠占用,當(dāng)5個(gè)人中的任何一個(gè)人讓開后,其中在等待的另外5個(gè)人中又有一個(gè)可以占用了。

另外等待的5個(gè)人中可以是隨機(jī)獲得優(yōu)先機(jī)會(huì),也可以是按照先來后到的順序獲得機(jī)會(huì),這取決于構(gòu)造Semaphore對(duì)象時(shí)傳入的參數(shù)選項(xiàng)。

單個(gè)信號(hào)量的Semaphore對(duì)象可以實(shí)現(xiàn)互斥鎖的功能,并且可以是由一個(gè)線程獲得了“鎖”,再由另一個(gè)線程釋放“鎖”,這可應(yīng)用于死鎖恢復(fù)的一些場(chǎng)合。

通過acquire()和release()獲取和釋放訪問許可,Semaphore可以初始化是0,然后通過release來變成1

sp.availablePermits()可以獲取當(dāng)前可訪問的許可的數(shù)量

sp.drainPermits()可以把所有許可全部清零

package java_thread;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;

public class SemaphoreTest {

public static void main(String[] args) {

ExecutorService service = Executors.newCachedThreadPool();

final Semaphore sp = new Semaphore(3);

for(int i=0;i<10;i++){

Runnable runnable = new Runnable(){

public void run(){

try {

sp.acquire();

} catch (InterruptedException e1) {

e1.printStackTrace();

}

System.out.println("線程" + Thread.currentThread().getName() +

"進(jìn)入,當(dāng)前已有" + (3-sp.availablePermits()) + "個(gè)并發(fā)");

try {

Thread.sleep((long)(Math.random()*10000));

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("線程" + Thread.currentThread().getName() +

"即將離開");

sp.release();

//下面代碼有時(shí)候執(zhí)行不準(zhǔn)確,因?yàn)槠錄]有和上面的代碼合成原子單元

System.out.println("線程" + Thread.currentThread().getName() +

"已離開,當(dāng)前已有" + (3-sp.availablePermits()) + "個(gè)并發(fā)");

}

};

service.execute(runnable);

}

}

}

總結(jié)

以上是生活随笔為你收集整理的java 多线程 信号_Java多线程——Semaphore信号灯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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