Java執行緒之Semaphore

2021-06-12 15:21:11 字數 1510 閱讀 7644

之前一直對semaphore不是很理解,感覺它功能十分簡單,用lock加condition完全可以輕易替代它,覺得它根本沒有存在的必要。最近遇到乙個例子,用semaphore可以優雅的實現,用lock加condition卻讓我大費腦筋,主要原因是自己水平太菜。記錄下來,免得以後忘了。

例子:某單位有3臺印表機,有10個使用者提交列印任務,寫程式模擬對印表機的管理。不廢話,直接上**

public class main 

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

}}

//執行緒的具體實現,也很簡單,就是呼叫printqueue方法列印一些內容

//具體列印什麼內容都省了,隨便模擬一下

public class job implements runnable

public void run()

}

用訊號量semaphore實現印表機佇列

public class printqueue ;

lockprinters = new reentrantlock(); }

public void printjob() catch(interruptedexception e) finally }

private int getprinter() ;

lockprinters = new reentrantlock();

cond = lockprinters.newcondition(); }

public void printjob() catch(interruptedexception e) finally }

private int getprinter() else catch (interruptedexception e)

}} lockprinters.unlock();

return ret; }

private void releaseprinter(int index)

}

比較後可見,使用lock加condition需要寫更多的**,而且邏輯上不是特別清晰,semaphore的使用是十分必要的。

另一種使用lock加condition的實現

public class printqueue ;

lockprinters = new reentrantlock();

permitlock = new reentrantlock();

cond = permitlock.newcondition();

printercount = 3; }

public void printjob() catch(interruptedexception e) finally }

private int getprinter() {

int ret = -1;

lockprinters.lock();

for(int i=0; i

Java多執行緒系列(二十二)Semaphore使用

訊號量用來控制能夠同時訪問的此時 semaphore semphore new semaphore 3 thread thread1 new thread new runnable catch interruptedexception e2 try catch interruptedexceptio...

JAVA多執行緒之 執行緒池

執行緒池顧名思義,就是乙個放置執行緒的池子。就跟資料庫連線池差不多。執行緒池通過對併發執行緒的控制,能有效的節省系統資源的浪費,提高系統的效能。學習執行緒池,先了解一下執行緒池的乙個基本結構 executor是乙個介面,其中只有乙個方法,就是execute方法。所以executor實際就是乙個執行緒...

Java多執行緒之執行緒安全

當多個執行緒訪問某乙個類 物件或方法時 這個類始終都能表現出正確的行為,那麼這個類 物件或方法 就是執行緒安全的。public class mythread extends thread public static void main string args 結果如下 t1正在執行 4 t1正在執行...