java - 我需要同步吗?

标签 java user-interface synchronization

我需要添加某种同步吗?我创建了另一个线程来管理与服务器的 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 的线程。

最佳答案

如果 manageResponsePacket() 更新 swing/awt GUI,则会遇到问题。您只能在 EDT 上更新 swing/awt GUI。使用 SwingUtilities.invokeLater() 通过 ResponsePacket 更新 GUI。

关于java - 我需要同步吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13139508/

相关文章:

java - java中如何按空格和点分割

java - 自定义Java注解引入方法参数并执行代码

delphi - 是否可以确定 dbEdit 中的文本是否比可见文本长?

Java:Runtime.getRuntime().exec() - 如何获取对已启动程序 JFrame 的引用?

用于防止重复订单的 Java 同步选项(文件、数据库锁定?)

java - 从另一个同步方法调用同步方法,两者都在不同的对象上

java - Swagger ReaderListener 未调用

java - 通过 JDBC 连接到数据库

java - 为什么我的图像不显示? (Java 图形用户界面)

database - SSDT SQL Server 数据库项目中模式比较的命令行/API?