为什么这段代码会冻结我的电脑?

Cya*_*ime 1 java io client-server server-side

这是非常糟糕的我必须做一个硬重启(按下电源按钮),它甚至没有给我时间调试,所以我基本上搞砸了,如果我没有在这里得到答案.我知道它是服务器端(因为它发生在我不运行客户端时,但如果我这样做也会发生).

这是服务器代码:

package cypri.games.cybatarserver;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class CybatarServer extends JFrame implements Runnable{
    String verNum = "0.0.0";
    JScrollPane jsp;
    JTextArea mainText;
    boolean stopServer = false;
    boolean waitForPlayers = true;
    Vector<Player> playersConnected;
    byte playerID = -1;

    public CybatarServer(){
        playersConnected = new Vector<Player>();

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(100, 100, 400, 100);

        this.setTitle("Cybatar Server " + verNum);

        mainText = new JTextArea(50, 10);
        mainText.setText("Welcome to CybatarServer "+ verNum + "!\n");
        mainText.setEditable(false);

        jsp = new JScrollPane(mainText);
        this.add(jsp);

        this.setVisible(true);
    }

    public static void main(String[] args){
        CybatarServer cyserv = new CybatarServer();
        cyserv.run();
    }

    @Override
    public void run() {

        try { 
            final ServerSocket serverSocket = new ServerSocket(44444);


            while(!stopServer){
                if(waitForPlayers){
                    new Thread(new Runnable() {
                        public void run() {

                            Socket clientSocket = null;
                                try {
                                    clientSocket = serverSocket.accept();
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                                playerID++;
                                new PlayerThread(playerID, playersConnected, mainText, playerID, clientSocket).start();
                                mainText.append("Player " + playerID + " connected!");

                        }
                    }).start();
                }

                else{
                    for(int i = 0; i < playersConnected.size(); i++){
                        playersConnected.get(i).update();
                    }
                }

                Thread.yield();
            }
        } catch (Exception e) { e.printStackTrace(); }
    }
}
Run Code Online (Sandbox Code Playgroud)

这里有什么东西可以导致我的电脑完全冻结吗?如果是这样,我该如何解决?

Bri*_*new 11

我猜测

while(!stopServer){
   if(waitForPlayers){
       new Thread(new Runnable() {
         ....
Run Code Online (Sandbox Code Playgroud)

正在生成和调用大量的线程.这会在CPU(运行那些线程)和内存(每个线程分配自己的堆栈空间)方面严重影响你的机器.

我怀疑你想接受传入的连接,然后才分配/启动一个线程.请注意,这仍然会让您受到DOS攻击(想象一下,如果有无限数量的玩家加入),但这对您来说可能不是一个实际问题.