gpt4 book ai didi

java - 在 2 个线程唤醒之前,JFrame 不会显示组件

转载 作者:行者123 更新时间:2023-12-02 06:36:38 24 4
gpt4 key购买 nike

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

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

主要方法也在 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();

我得到一个空指针异常!!提前欢呼

最佳答案

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

启动套接字连接的代码应该在单独的线程中执行,这样它就不会阻塞 EDT。阅读 Swing 教程中关于 Concurrency 的部分了解更多信息。您可以创建自己的线程或使用 SwingWorker 来实现此目的。

关于java - 在 2 个线程唤醒之前,JFrame 不会显示组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19573463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com