我有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)。 –