我有這樣的方法來寫郵件到插座插座:關閉時,所有待處理的郵件已發送
public void sendMessage(byte[] msgB) {
try {
synchronized (writeLock) {
log.debug("Sending message (" + msgB.length + "): " + HexBytes.toHex(msgB));
ous.write(HEADER_MSG);
ous.writeInt(msgB.length);
ous.write(msgB);
ous.flush();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
現在一個線程調用鮑勃想在某個undeterministic時刻X關閉套接字,這意味着可能仍有線程等待writeLock
發送他們的消息,甚至可能有一個線程正在寫入它的中間。
我可以通過關閉套接字之前讓鮑勃獲取writeLock
解決了後者,但我仍然可以失去尚未開始發送消息,因爲據我所知是不公平的,鮑勃能拿在一些等待時間更長的其他線程之前鎖定。
我需要的是所有的呼叫sendMessage
作出X前通常做他們的工作,並要求作出後X拋出一個錯誤。我怎樣才能做到這一點?
- 具體細節:鮑勃是線程從套接字的輸入流和X當在該流接收到「關閉」消息是讀取。
我用我自己的方法,因爲我不想添加另一個線程到已經有數百個,但upvoted無論如何因爲它在技術上是正確的方式來做到這一點。 – 2010-11-18 16:07:07