2014-02-28 5 views
0

소켓이있는 스레드가 있습니다. 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 
    } 
}); 
+0

귀하의 솔루션은 일반적으로 괜찮다고 생각하지만, [생산자 - 소비자 패턴] (http://java.dzone.com/articles/producer-consumer-pattern)을 구현하면 도움이 될 것이라고 생각합니다. 소켓 스레드는 블로킹 큐에 추가되는 메시지를 생성합니다.이 큐는 새로운 메시지/데이터를 사용할 수있을 때마다 다른 클래스 (현재 가지고있는 이벤트 리스너)가 가져옵니다. –

+0

동기화 블록을 제거해야합니까? – Sanyin

+0

예, 생산자 - 소비자 패턴을 수행하고 블로킹 큐를 사용하는 경우 [블로킹 큐의 추가/제거 메소드는 스레드로부터 안전합니다] (http://stackoverflow.com/a/)와 같이 동기화 블록이 필요하지 않습니다. 2695437/8747472). –

답변

0

매우 양호합니다. eventListener을 변경하지 않는 한 동시성 문제는 없습니다. 그러나 fireSomeEvent()SocketThread에서 실행됩니다. 스레드로부터 안전하지 않은 무언가를하고 있다면 문제가 발생할 수 있습니다. 그래서 당신은 일종의 동기화가 필요합니다.

+0

이벤트가 SocketThread에서 시작된다는 것을 알고 있습니다. 발생 된 이벤트가 일부 주 스레드의 데이터에 액세스하는 경우 해당 데이터를 실행 된 이벤트에서 잠그는 방법은 무엇입니까? 동기화 된 블록에서 해당 이벤트를 이미 실행하고 있습니다 (제거해야합니까?) – Sanyin

+0

동기화 된 블록은 하나의 소켓에서 동시에 여러 이벤트를 발생시키지 않는 경우에만 유용합니다 (실행 방법이 새 스레드없이 실행되면 어쨌든 발생하지 않아야 함) . 난 당신이 찾고있는 주요 개체 (참고 : 개체, 스레드가 아닌)에서 동기화하는 것 같아요. – ddmps

+0

하지만 루프 내에서 동일한 스레드 (주)에 추가되는 일부 목록을 사용하여 여러 이벤트를 실행하는 데 적합합니까? – Sanyin

관련 문제