1

GUI(Swing)を伴うクライアントアプリケーションを作成しています。私の2つのクラス、ClientClassとMainFrameは異なるスレッドを実行していますが、相互にメソッドを呼び出す必要があります。ClientClassは、EventQueueスレッド(displayGUI())でアプリケーションのライフサイクル中のある時点でGUI(MainFrame)をインスタンス化します。ClientClassには、メインフレームを更新する、クライアントクラススレッドから呼び出されるrecv()のような多くのメソッドが含まれています。次に、MainFrameには、ClientClassのメソッドを呼び出すボタンのプッシュなどのイベントによってトリガーされるメソッドがあります。例のボタン押下を処理する迷惑なメソッドがEventQueueスレッドによって呼び出されていると思いますか?

この種のアプリケーションは非常に一般的であると確信しており、他の人の洞察が大好きです。私がしていることはスレッドセーフではないと感じていますが、このアプリケーションの現在のモデルを修正/改善するにはどうすればよいですか?

コード例:

MainFrame.java:

public MainFrame(ClientClass c) {
    client = c;

    // <Misc init code here>

    btnSend = new JButton("Send");
    btnSend.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseClicked(MouseEvent arg0) {
            client.send("Hello!");
        }
    });
    btnSend.setBounds(171, 120, 89, 23);
    contentPane.add(btnSend);
}

public void updateElement() {
    // Update of some element here, called from ClientClass
}

ClientClass.java:

private MainFrame mainFrame;

public ClientClass() {
}

public void displayGUI() {
    final ClientClass c = this;

    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                mainFrame = new MainFrame(c);
                mainFrame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public void send(String msg) {
    // Socket send operations here
    // Currently called by the GUI's EventQueue thread?
}

public void recv() {
    // Socket recv operations here
    mainFrame.updateElement();
}
4

2 に答える 2