public class EventMessage implements Message {
public final Event event;
public EventMessage(Event e) {
this.event = e;
}
public void doOnMessage() {
e.getSource().dispatchEvent(e);//简单的例子。不要误解:>
}
}
消息派发线程:
public void run() {
while(true) {
synchronized(messageQueue) {
while(messageQueue.isEmpty()) {
try {
messageQueue.wait();
} catch (InterruptedException e) {
return;//interrupted here
}
}
Message msg = messageQueue.get();
}
msg.doOnMessage();//no lock hold here;
}
}
public boolean postMessage(Message m) {
synchronized(messageQueue) {
return messageQueue.putMessage(m);
}
}
还有一类应用,属于发送消息后需要等待到消息处理结束,不过这个应用是有一定的危险性的,比如在消息派发线程的处理中又产生了新的消息,并且等待这个消息,那么将出现死锁。在java.awt.eventQueue中提供了方法invokeAndWait中将判断当前线程是否为dispatching thread,如果是将出现错误。我们也可以效仿这种方式,抛出异常。另外对于等待的实现,我的做法是仍然以接口的形式放到Message中,添加两个:
public void waitForMe(long timeout);
public void notifyMe();
一个简单的实现可以是(客户可以制定其他的等待方式):
增加一个isDone标志,默认false;