【发布时间】:2014-04-01 17:21:13
【问题描述】:
我有里面有 Socket 的线程。当 soket 接收到一些数据时,我需要触发事件(使用我的子类 EventObject)。事件侦听器是从主线程添加的(到某个列表?)。这样可以吗?
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
}
});
【问题讨论】:
-
我认为您的解决方案通常没问题,但我认为您可能会从实施producer-consumer pattern 中受益。您的套接字线程产生的消息被添加到阻塞队列中,只要有新消息/数据可用,另一个类(您目前拥有的事件侦听器)就会从中获取。
-
我应该删除同步块吗?
-
是的,如果您使用生产者-消费者模式并且使用阻塞队列,则不需要像 the blocking queue's add / take methods are thread safe 那样的同步块。
标签: java multithreading sockets