【问题标题】:Why the program hangs after pressing the connect button?为什么程序在按下连接按钮后挂起?
【发布时间】:2018-03-16 21:30:19
【问题描述】:

我想启动一个无论是否有客户端都将运行的服务器,但是当我按下连接按钮时,即使我为函数runServer() 启动了一个新线程,它(GUI)也会挂起。 提前致谢,非常感谢您的帮助。

 class HandleAClient implements Runnable {
    private Socket socket;

    public HandleAClient(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        try{
            DataInputStream inputFromClient = new DataInputStream(socket.getInputStream());
            DataOutputStream outputToClient = new DataOutputStream(socket.getOutputStream());
        }catch(IOException ioex){
            System.err.println(ioex);
        }
    }

}
//==========================================================================  
//==========================================================================
private void runServer()
{
    try{


        while(true){ 
           Socket socket = server.accept();
            HandleAClient task = new HandleAClient(socket);
            new Thread(task).start();
        }  
    }catch(IOException ioex){
        ioex.printStackTrace();
    }

}//end method runServer
  //=====================================================================
 //=====================================================================


   private void Connect_BtnActionPerformed(java.awt.event.ActionEvent evt) {                                            
    // TODO add your handling code here:
    username = UserName_TF.getText();
    passwordtext = Password_TF.getText();

    try {
        conn = DriverManager.getConnection(url, username, passwordtext);      
        if(conn.isValid(0))
            connected = true;

        jButton3.setEnabled(true);
        jLabel4.setText("Connected");
        UserName_TF.setEnabled(false);
        Password_TF.setEnabled(false);

        //java.awt.EventQueue.invokeLater(() -> {
            runServer();
        //});

    } catch (SQLException e) {
        //System.err.println(e);
        JOptionPane.showMessageDialog(null, e);
    }
}

【问题讨论】:

  • 您启动了一个新线程,但该新线程只创建流(似乎没有在任何地方使用)。 runServer() 不在该线程上执行。
  • @Vince 但不是行 //java.awt.EventQueue.invokeLater(() -> { runServer(); //});意味着我为 runServer() 启动了一个新线程
  • 不,这意味着您将runServer() 代码提交给Event Dispatch Thread,这是处理用户输入和呈现请求等事件的同一线程。由于runServer() 会阻塞直到连接被接受,所以它会阻塞 EDT 处理绘画等关键事件,从而导致您看到的冻结。
  • @Vince 如果有一个快速的方法,你会建议如何解决这个问题....?
  • “如果有快速的方法,你会建议如何解决这个问题....?” SwingWorker(反正我说得很快)。

标签: java multithreading swing freeze


【解决方案1】:

我将代码更改为以下内容(感谢 Vince 的建议

public class MyThread extends Thread {

//private int var;

public MyThread() {
    //this.var = var;
}

@Override
public void run() {
    try {
        while (true) {
        Socket socket = server.accept();
        DataInputStream inputFromClient = new DataInputStream(socket.getInputStream());
        DataOutputStream outputToClient = new DataOutputStream(socket.getOutputStream());
        }
    } catch (IOException ex) {
        Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
    }
}
}

//=========================================================================
private void Connect_BtnActionPerformed(java.awt.event.ActionEvent evt) {                                            
    // TODO add your handling code here:
    username = UserName_TF.getText();
    passwordtext = Password_TF.getText();

    try {
        conn = DriverManager.getConnection(url, username, passwordtext);      
        if(conn.isValid(0))
            connected = true;

        jButton3.setEnabled(true);
        jLabel4.setText("Connected");
        UserName_TF.setEnabled(false);
        Password_TF.setEnabled(false);
            //JOptionPane.showMessageDialog(null, "Connection Established");

            new Login.MyThread().start();


    } catch (SQLException e) {
        //System.err.println(e);
        JOptionPane.showMessageDialog(null, e);
    }
}    

【讨论】:

    猜你喜欢
    • 2016-10-04
    • 1970-01-01
    • 2018-03-13
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    相关资源
    最近更新 更多