【问题标题】:JFrame wont display components until 2 threads are awakeJFrame 在 2 个线程唤醒之前不会显示组件
【发布时间】:2013-10-24 18:13:34
【问题描述】:

希望有人可以帮助我解决这个问题。我有一个多线程服务器应用程序,其中 GUI JFrame 在两个客户端线程都唤醒之前不会显示组件。每个客户端都是一个使用内部类 ext Thread 创建的线程。

一个客户端通过套接字连接加入,建立流,然后暂停,直到客户端 2 加入并且相同。一旦建立了两个客户端线程并创建了流,客户端 1 就会设置为暂停(假),并且两个客户端线程都处于唤醒状态。只是现在 JFrame 才显示组件....

main 方法也在 EDT 上被调用:

 public static void main(String[] args) {

    SwingUtilities.invokeLater(new Runnable(){

        @Override
        public void run() {
                MorseCode_Server serverApp= new MorseCode_Server();
                serverApp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    serverApp.execute();

        }

不确定这里有什么相关的代码,所以我添加了这些: 该方法是外部类中第一个调用的方法,它设置每个客户端/播放器并暂停第一个线程,直到第二个准备好:

displayMessage("Execute Called(): ");
    for (int i = 0; i < players.length; i++) {
        try {
            players[i] = new Player(socket.accept(), i);//assign soc & playerNumber
            //clientIP[i] =  //get IP address for message log
            players[i].start();//JVM calls the threads run method
            displayMessage("Execute(): Player " + players[i] + " socket created in execute (OUTER CLASS)");
            //get IP address of playet[i]


        } catch (IOException e) {
            e.printStackTrace();
            System.exit(1);
        }
    }//end for
    //player 0 is suspended once socket created until player 1 is instantiated
    //must retrun player 0 to resume state in synchronised block to allow one 
    //thread access at a time
    synchronized (players[0]) {
        players[0].setSuspended(false);
        players[0].notifyAll();//wake up threads waiting on this object
        displayMessage("Execute(): "+ players[0] + " players number notifyAll called in execute");
    }//end synchronised block

这是每个客户端线程的内部类构造函数:

private class Player extends Thread {
    //instance varibles for each client/player
public Player(Socket accept, int i) {
        connection = accept;
        //clientIP[i] = connection.getRemoteSocketAddress().toString();
        playerNumber = i;
        displayMessage("Player " + playerNumber + " costructor thread inner class  called");
        //open socket streams for communication
        try {
            //objectouptstream obj wraps the low level code from getOutputStream method
            output = new ObjectOutputStream(connection.getOutputStream());
            output.flush();
            input = new ObjectInputStream(connection.getInputStream());
            displayMessage("Player " + playerNumber + " output/input streams set up in Player inner class..END CONSTRUCTOR PLAYER");

        } catch (IOException e) {
            e.printStackTrace();
        }



    }//end constructor inner class Player

另外,当我尝试通过其连接获取客户端的 IP 地址时:

clientIP[i] = connection.getRemoteSocketAddress().toString();

我得到一个空指针异常!! 提前喝彩 C

【问题讨论】:

  • clientIP[i] = ... 指令在哪里?
  • 现在在播放器构造函数中,现在排序了

标签: java multithreading swing sockets network-programming


【解决方案1】:

不要在事件调度线程 (EDT) 上执行长时间运行的代码。这会导致 GUI 冻结。

启动套接字连接的代码应在单独的线程中执行,以免阻塞 EDT。阅读 Concurrency 上的 Swing 教程中的部分以获取更多信息。您可以创建自己的线程或为此使用 SwingWorker。

【讨论】:

  • 干杯,我尝试将第一个执行方法(创建和挂起 bew 客户端线程)包装在一个 swingworker 线程中......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多