有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java线程的while(true)循环只运行一次

我有一个实现Runnable的类,我用另一个在窗口打开时运行的方法启动它自己的线程,但是Runnable方法中的while循环只运行一次,我知道这一点,因为它只显示一次输出。这是下面的代码

static private final int SOCKET = 2222;
static JFrame frame = new JFrame();
static private ServerSocket serverSocket;
static private Socket socket;
static private DataOutputStream out;
static private DataInputStream in;
static private ArrayList<User> users = new ArrayList<>();
static private int logged = -1;

public GameServer() {
    initComponents();
}

public void runServer() {
    Thread server = new Thread(new StartServer());
    server.start();
}

public void addUser(int logged, Socket socket, JTextArea taOut) {
    users.add(logged, new User(socket, taOut, this, logged));
    Thread thread = new Thread(users.get(logged));
    thread.start();
}

public void removeUser(int index, Socket socket) {
    users.remove(index);
    updateIndexes();
    try {
        socket.close();
    } catch (Exception e) {
        taOut.append("Failed to close connection to user.\n");
    }
}

public void updateIndexes() {
    for (int i = 0; i == users.size()+1; i++) users.get(i).lowerIndex();
    logged--;
}

public class StartServer implements Runnable {
    @Override
    public void run() {
        taOut.append("Attempting to start server.\n");
        try {
            serverSocket = new ServerSocket(SOCKET);
        } catch (Exception e) {
            taOut.append("Port "+SOCKET+" is in use.\n");
            return; // Prevent any further code from executing
        }
        taOut.append("Server started successfully.\n");
        while (true) {
            try {
                taOut.append("Waiting for user...\n");
                socket = serverSocket.accept(); // Wait for user to connect
                logged++;
                addUser(logged, socket, taOut);
                taOut.append("Login request from: "+socket.getInetAddress()+"\n");
            } catch (Exception e) {
                taOut.append("There was an error with a user trying to connect.\n");
            }
            break;
        }
    }
}

private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  
    runServer();
}  

共 (1) 个答案

  1. # 1 楼答案

    循环体以终止循环的break;结尾。只要把它取下来,你就没事了