소켓이있는 스레드가 있습니다. soket이 어떤 데이터를받을 때, 나는 서브 클래스 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)을 구현하면 도움이 될 것이라고 생각합니다. 소켓 스레드는 블로킹 큐에 추가되는 메시지를 생성합니다.이 큐는 새로운 메시지/데이터를 사용할 수있을 때마다 다른 클래스 (현재 가지고있는 이벤트 리스너)가 가져옵니다. –
동기화 블록을 제거해야합니까? – Sanyin
예, 생산자 - 소비자 패턴을 수행하고 블로킹 큐를 사용하는 경우 [블로킹 큐의 추가/제거 메소드는 스레드로부터 안전합니다] (http://stackoverflow.com/a/)와 같이 동기화 블록이 필요하지 않습니다. 2695437/8747472). –