java 多线程 信号_Java多线程——Semaphore信号灯
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我想你是爱我的是哪首歌啊?
- 下一篇: java 字符处理_Java字符串处理实