【问题标题】:Thread's while (true) loop only running once线程的 while (true) 循环只运行一次
【发布时间】:2016-08-02 07:17:37
【问题描述】:

我有一个实现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();
}  

【问题讨论】:

  • 在 try-catch 块之后 break 不足为奇

标签: java multithreading while-loop server


【解决方案1】:

循环体以终止循环的break; 结束。只需将其删除,您应该就可以了。

【讨论】:

  • 感谢您的信息,我想我应该更多地研究循环而不是线程的东西。
  • @Jono 如果你在不了解循环的情况下进入线程,那相当于先爬上一棵树。
  • @Kayaman 我暂时没有做任何 Java,我只需要复习一下。
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 2013-08-12
相关资源
最近更新 更多