2012-10-30 214 views
0

我是否需要添加某种同步?我创建另一个线程来管理与服务器的TCP通信。流程是这样的:我需要同步吗?

private void sendLetterButtonActionPerformed(java.awt.event.ActionEvent evt) {             
try { 
// TODO add your handling code here: 
    session.getCurrentMatch().guessALetter(this.letterTextField.getText()); 
} catch (Exception ex) { 
    JOptionPane.showMessageDialog(this, "Please insert one letter only"); 
}} 

public void guessALetter(String l) throws Exception { 
    DataPacket dp = new DataPacket(); 
    Communicator c = new Communicator(p, session); 
    c.start(); 
} 

public class Communicator extends Thread { 

private Packet packet; 
private Session session; 

public Communicator(Packet p, Session s) { 
    this.session = s; 
    this.packet = p; 
} 

public void run() { 
    System.out.println("Communicator: "+Thread.currentThread()); 
    Socket socket = session.getClientSocket(); 
    ObjectOutputStream out = session.getOut(); 
    ObjectInputStream in = session.getIn(); 

    ResponsePacket reply; 


    try { 

     out.writeObject(this.packet); 
     out.flush(); 

     reply = (ResponsePacket) in.readObject(); 
     System.out.println("Received" + reply.getCurrentWordView() + reply.getCurrentWordView()); 

     session.getCurrentMatch().setLastReply(reply); 

     session.getCurrentMatch().manageResponsePacket(reply); 

    } catch (ClassNotFoundException ex) { 
     Logger.getLogger(Communicator.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (IOException ex) { 
     Logger.getLogger(Communicator.class.getName()).log(Level.SEVERE, null, ex); 
    }finally{ 

    }}} 

public void manageResponsePacket(ResponsePacket reply) { 

    this.setLastReply(reply); 

    if (reply.isGameMode()) { 
     setWordView(reply.getCurrentWordView()); 
     setCounter(reply.getFailedAttemptsCounter()); 

     setChanged(); 
     notifyObservers(EventEnum.GAMERESPONSE); 
    } else if (reply.isGameOverMode()) { 
    } 
} 

因此,大家可以看到第二个线程是更新GUI的一个。

+1

我只看到一个线程。 – jtahlborn

+0

的方法“guessALetter”,一个新的线程启动 – wollow

+0

是的,这是一个我看。 – jtahlborn

回答

1

如果manageResponsePacket()更新摆动/ AWT GUI,你有问题。您只能更新EDT上的swing/awt GUI。使用SwingUtilities.invokeLater()用ResponsePacket更新GUI。

+0

好吧,我实际上使用观察者模式,所以我只是从该方法调用notifyObservers。那是问题吗? – wollow

+0

是notifyObservers同步还是异步? – jtahlborn

+0

我用的Java(执行和延长观察的和观察员)提供的一个,所以我不知道它是如何实现的。 – wollow