我有Socket內部的線程。當soket收到一些數據時,我需要觸發事件(使用我的sublassed EventObject)。事件監聽器是從主線程添加的(到某個列表?)。這個可以嗎?如何從Java線程觸發事件監聽器
Pseudocode:
public class SocketThread extends Thread{
private Socket socket;
private MyEventListener eventListener;
public SocketThread(Socket socket, MyEventListener eventListener) {
this.socket=socket;
this.eventListener=eventListener;
}
public void run() {
get socket input stream...
get socket output stream...
when data received, call process(data)
}
void process(data){
synchronized(this){
myEvent event=new MyEvent(data);
eventListener.fireSomeEvent(myEvent);
}
}
// main thread
ServerSocket serverSocket=new ServerSocket(host,port);
Socket socket= serverSocket.accept();
ClientThread cthr = new SocketThread (sckt,new MyEventListener(){
void fireSomeEvent(MyEvent event){
//some code
}
});
我認爲你的解決方案通常是好的,但我想你可能會從實施[生產者 - 消費者模式](http://java.dzone.com/articles/producer-consumer-pattern)中受益。您的套接字線程會生成添加到阻塞隊列中的消息,當有新消息/數據可用時,其他類(您當前擁有的事件偵聽器)將從其中捕獲該消息。 –
我應該刪除syncronization塊嗎? – Sanyin
是的,如果您執行生產者 - 消費者模式並且使用阻塞隊列,則不需要同步塊[阻塞隊列的add/take方法是線程安全的](http://stackoverflow.com/a/ 877472分之2695437)。 –