之前一直對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正在執行...