我里面有套接字的线程。当 soket 收到一些数据时,我需要触发事件(使用我的订阅事件对象)。事件侦听器是从主线程(添加到某个列表?可以吗?
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
}
});
这
似乎很好。只要您不更改eventListener
就不存在并发问题。但请注意,fireSomeEvent()
将从SocketThread
运行。如果您在那里执行的操作不是线程安全的,则可能会(将)遇到问题。所以这就是你需要某种同步的地方。