...浠嶣lockingQueue涔熷彲浠ョ湅鍑猴紝瀹冨拰UNIX緋葷粺涓嬮潰鐨凱ipe鍗佸垎鐩鎬技銆傛墍涓嶅悓鐨勪笉榪囨槸涓ょ偣錛岄鍏堬紝pipe鏄繘紼嬮棿鐨勶紝鍛藉悕綆¢亾鐢氳嚦鍙互鍦ㄩ潪浜茬紭榪涚▼闂翠嬌鐢紝鑰孊lockingQueue 鐩墠鍙槸綰跨▼闂寸殑閫氫俊鎵嬫銆傚綋鐒訛紝鐢變簬java鏈韓寮哄ぇ鐨勫姩鎬佺被瑁呰澆鍔熻兘錛岃繖涓己闄峰java紼嬪簭涔嬮棿鐨勬矡閫氶檺鍒跺茍涓嶅ぇ銆傚叾嬈★紝pipe鏄熀浜庡瓧鑺傛祦鐨勶紝鑰孊lockingQueue鏄? 鍩轟簬瀵硅薄鐨勶紝榪欎嬌寰桞lockingQueue鏇村姞鏄撶敤錛屼笉榪囧嵈璁〣lockingQueue緇戝畾浜咼ava璇█錛屼嬌榪涗竴姝ユ垚涓鴻交閲忕駭鏈湴榪涚▼閫氫俊宸ュ叿鐨勯毦搴﹀澶с?
BlockingQueue<String> q =new ArrayBlockingQueue<String> (10);
...
public void supply () {
q.put("product by "+Thread.currentThread().getId()+":"+(++productNo));
}
...
public void cunsume () {
String product =q.take();
System.out.println("consume product:"+product);
}
浠庡墠闈㈠鐢熶駭/娑堣垂妯″瀷鐨勮涓烘柟寮忓彲浠ョ湅鍑猴紝鐢熶駭/娑堣垂妯″瀷鐫閲嶄簬瑙勮寖娑堣垂鑰呯殑琛屼負妯″紡錛屽綋娑堣垂閫熷害瓚呰繃鐢熶駭閫熷害鐨勬椂鍊欙紝娑堣垂鑰呭氨浼氳闃誨銆傝屽浜庣敓浜ц呯殑琛屼負鍒欐病鏈? 瑙勫畾銆傚綋鐢熶駭閫熷害瓚呰繃娑堣垂閫熷害錛岀敓浜ц呯殑琛屼負妯″紡鍙互鍒嗕負浠ヤ笅鍑犵錛? #褰撶Н鍘嬬殑浜у搧杈懼埌涓瀹氭暟閲忔椂錛岀敓浜ц呰闃誨 #鏃犺鏈夊灝戠Н鍘嬩駭鍝侊紝鐢熶駭鑰呴兘涓嶄細琚樆濉? #涓嶈兘鏈変換浣曠Н鍘嬩駭鍝侊紝鐢熶駭鑰呭湪褰撳墠浜у搧鏈娑堣垂涔嬪墠錛屼細琚樆濉? 瀵逛簬浜у搧鏉ヨ錛屼篃鏈変笉鍚岀殑琛屼負妯″紡 #浜у搧鍙湁鍦ㄨ鐢熶駭鍑烘潵涓孌墊椂闂翠箣鍚庢墠鑳借娑堣垂(鍏堣姳鐐規椂闂存櫨鏅懼共錛? #涓嶅悓綾誨埆鐨勪駭鍝佽娑堣垂鐨勪紭鍏堢駭涓嶅悓(鏈夐捇鐭崇殑璇濓紝榛勯噾灝卞厛鏀句竴杈瑰惂:))
鏍規嵁鐢熶駭鑰呰涓烘ā寮忕殑涓嶅悓Concurrent鍖呮彁渚涗簡涓嶅悓鐨凚lockingQueue鐨勫疄鐜?
||Queue縐嶇被||琛屼負鎻忚堪
|ArrayBlockingQueue
榪欎簺涓嶅悓鐨勮涓烘ā寮忎腑錛岃緝涓哄父瑙佺殑闄や簡ArrayBlockingQueue鍜孡inkedBlockingQueue涔嬪錛孭riorityBlockingQueue涔熼潪甯擱噸瑕併備婦渚嬫潵璇達紝濡傛灉鎴戜滑鍒╃敤BlockingQueue 鏉ュ疄鐜頒竴涓偖浠剁郴緇燂紙钁楀悕鐨剄mail灝辨槸鍒╃敤pipe鎶鏈瀯寤虹殑鏍稿績鏋舵瀯錛夈傛垜浠煡閬撻偖浠舵湁涓嶅悓鐨勭駭鍒紝濡傛灉褰撳墠闃熷垪閲屾湁鍔犳ラ偖浠墮渶瑕佸鐞嗙殑璇濓紝緋葷粺灝嗕紭鍏堝鐞嗗姞鎬ラ偖浠躲? 鎴戜滑灝嗕互閭歡浼犻掍負渚嬪瓙錛岃鏄嶱riorityBlockingQueue鐨勪嬌鐢ㄦ柟娉曘傦紙娉細榪欓噷鐨勮繖涓偖浠舵ā鍨嬪彧鏄竴涓潪甯哥畝闄嬬殑妯″瀷錛岀敤鏉ヨ鏄嶱riorityBlockingQueue鐨勪嬌鐢ㄦ柟娉曡屽凡錛? 鍜屽疄闄呭簲鐢ㄦ湁寰堝ぇ鐨勫樊璺濓級
棣栧厛錛屾垜浠渶瑕佷簡瑙i偖浠朵紶閫掕繃紼嬬殑鍩烘湰妯″瀷銆傚湪榪欎釜綆鍗曠殑閭歡浼犻佹ā鍨嬩腑娑夊強鍒頒笅鍒楁蹇? *MDA: Mail Deliver Agent, 璐熻矗鎺ュ彈鎸囧畾鐢ㄦ埛鐨勯偖浠躲? *MTA: Mail Transfer Agent, 璐熻矗鎺ュ彈榪滅▼浼犻佽繃鏉ョ殑閭歡錛屽茍灝嗗叾浼犻佺粰鏀朵歡浜虹殑MDA 瀹冧滑鍜岄偖浠剁敤鎴蜂箣闂寸殑鍏崇郴濡備笅鍥?/p>
public class MailQueue<E> extends PriorityBlockingQueue<E>{涓轟簡鑳藉鏍規嵁鏀朵歡浜虹殑Mail Address鎵懼埌鐩稿簲鐨凪ail Queue, 浣跨敤涓涓狹ailQueueFactory鏉ヤ駭鐢烳ailQueue
public E take () throws InterruptedException {
E ren =super.take();
Utils._log("take:"+ren);
return ren;
}
public void put (E o) {
super.put(o);
Utils._log("put:"+o);
}
}
public class MailQueueFactory {闇瑕佹敞鎰忕殑鏄紝鎴戜滑鍦∕ailQueueFactory閲岄潰浣跨敤浜咰oncurrentHashMap錛岃屼笉鏄紶緇熺殑Hashtable, 铏界劧Hashtable鏄痶hread-safe錛屼絾鏄己涔弍utIfAbsent榪欐牱鐨? 鍘熷瓙鍑芥暟錛屽鏋滀笉灝忓績璁捐鐨勮瘽錛屼細閫犳垚瀵瑰悓涓涓狹ailQueue閲嶅鍒濆鍖栵紝浠庤屽鑷存閿侀棶棰樸? 涓嬮潰鐪婱ail鐨勫畾涔?
//A ConcurrentHashMap is used here instead of Hashtable
static ConcurrentHashMap<MailAccount,MailQueue<Mail>> mailQueues =
new ConcurrentHashMap<MailAccount,MailQueue<Mail>>();
public static BlockingQueue<Mail> getMailQueue (MailDeliverer e) {
return getMailQueue(e.getMailAccount());
}
public static BlockingQueue<Mail> getReceiveMailQueue (Mail m) {
return getMailQueue (m.getReceiver());
}
public static BlockingQueue<Mail> getMailQueue (MailAccount e) {
mailQueues.putIfAbsent (e,new MailQueue<Mail>());
MailQueue<Mail> mailQ =mailQueues.get(e);
return mailQ;
}
}
public class Mail implements Comparable{榪欓噷鍊煎緱娉ㄦ剰鐨勬槸AtomicInteger鐨勪嬌鐢紝瀹冭鐢ㄦ潵鍋氬唴閮╯erialNumber鐨勪駭鐢熴傚彟澶栧氨鏄痗ompareTo鍑芥暟鐨勪嬌鐢紝PriorityBlockingQueue浣跨敤Comparable鎺ュ彛鏉ュ垽瀹氬厓绱犵殑浼樺厛綰у埆銆傝繖閲屾墍瀹氫箟鐨勪紭鍏堢駭濡備笅錛? *濡傛灉閭歡綾誨埆鐩稿悓錛屽垯搴忓垪鍙峰皬鐨勯偖浠舵湁杈冨ぇ鐨勪紭鍏堢駭 *濡傛灉閭歡綾誨埆涓嶅悓錛屽垯emergencyMail鏈夎緝澶х殑浼樺厛綰? 鏈鍚庢槸Deliver Agent 鍜?Transfer Agent鐨勪唬鐮?
public final static int emergencyMail =0;
public final static int normalMail =1;
static AtomicInteger serialCounter =new AtomicInteger(0);
private int mailLevel;
private int serialNumber =serialCounter.addAndGet(1);
private MailAccount receiver =null;
private MailAccount sender =null;
private Date sendTime =new Date();
public Mail (String from, String to, int level) {
...
}
//Get functions
...
public int compareTo(Object o) {
if (o instanceof Mail) {
return compareTo ((Mail)o);
}
return 0;
}
public int compareTo (Mail o) {
if (o.mailLevel==this.mailLevel) { //Same level, compare the serial no
if (o.serialNumber==this.serialNumber)
return 0;
if (o.serialNumber>this.serialNumber)
return -1;
return 1;
}
if (this.mailLevel==emergencyMail) return -1;
return 1;
}
//Other functions
...
}
public class MailDeliverer {
MailAccount mailAccount =null;
public MailDeliverer (MailAccount account) {
this.mailAccount =account;
}
public MailAccount getMailAccount() {
return mailAccount;
}
public Mail retrieveMail () {
Mail mail =null;
while (mail==null) {
try {
mail =MailQueueFactory.getMailQueue(this).take();
}catch (Exception e) {
Utils._log("Encounter Exception",e);
}
}
return mail;
}
}
public class MailTransfer {
private static MailTransfer instance =new MailTransfer ();
private MailTransfer () { }
public static MailTransfer getInstance () {
return instance;
}
public void processMail (Mail m) {
BlockingQueue mailQ =MailQueueFactory.getReceiveMailQueue(m);
try {
mailQ.put(m);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}