【发布时间】: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