Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法创建新的本机线程_Java_Multithreading_Out Of Memory - Fatal编程技术网

Java 无法创建新的本机线程

Java 无法创建新的本机线程,java,multithreading,out-of-memory,Java,Multithreading,Out Of Memory,当我启动我的服务器时,我得到了这个错误,但是服务器仍然工作正常 线程“main”java.lang.OutOfMemoryError中出现异常:无法 在java.lang.thread.start0(本机方法)创建新的本机线程 在java.lang.Thread.start(Thread.java:658)处 main(Server.java:21) 儿童班 public Child(DatagramSocket ssocket) { this.socket = ssock

当我启动我的服务器时,我得到了这个错误,但是服务器仍然工作正常

线程“main”java.lang.OutOfMemoryError中出现异常:无法 在java.lang.thread.start0(本机方法)创建新的本机线程 在java.lang.Thread.start(Thread.java:658)处 main(Server.java:21)

儿童班

public Child(DatagramSocket ssocket) {  
         this.socket = ssocket;  

       }  


       public void run() {  
           while(true)
            {
               byte[] receiveData = new byte[1024];
编辑: 我试着在这个例子中,它在这里工作得很好

public static void main(String[] args) throws IOException {
        server = new MyServer();
        server.runServer();
    }

    private void runServer() {        
        int serverPort = 8071;
        try {
            System.out.println("Starting Server");
            serverSocket = new ServerSocket(serverPort); 

            while(true) {
                System.out.println("Waiting for request");
                try {
                    Socket s = serverSocket.accept();
                    System.out.println("Processing request");
                    executorService.submit(new ServiceRequest(s));
                } catch(IOException ioe) {
                    System.out.println("Error accepting connection");
                    ioe.printStackTrace();
                }
            }
        }catch(IOException e) 

您正在无限while循环中创建新的子对象,直到所有可用内存被消耗。

new Child()
还是
cServer.start()
阻塞?我怀疑您的
while(true)
是一个快速的无限循环,它会占用您的堆空间。一旦抛出OutofMemoryError(最多毫秒),应用程序将完成,服务器将回收所有内存,因此看起来您的服务器仍在工作。

您打算启动多少线程?!哇,你不仅仅启动了一台服务器,还启动了许多服务器。有多少这很难说,但直到线程用完为止块,等待连接。所以它不会像你发布的代码那样快速循环。您需要调用
accept()
或类似的调用。您需要监听多少台服务器?我猜只有一个。只需一次启动一个线程,直到字节[]被填满,然后处理它并结束线程,然后设置另一个线程进行侦听。也许您的孩子应该实现Runnable,然后您可以使用java.util.concurrent.ThreadPoolExecutor。你为什么不为你需要解决的真正问题寻找一个解决方案,并复制它呢。通过这种方法可以学到很多东西。
public static void main(String[] args) throws IOException {
        server = new MyServer();
        server.runServer();
    }

    private void runServer() {        
        int serverPort = 8071;
        try {
            System.out.println("Starting Server");
            serverSocket = new ServerSocket(serverPort); 

            while(true) {
                System.out.println("Waiting for request");
                try {
                    Socket s = serverSocket.accept();
                    System.out.println("Processing request");
                    executorService.submit(new ServiceRequest(s));
                } catch(IOException ioe) {
                    System.out.println("Error accepting connection");
                    ioe.printStackTrace();
                }
            }
        }catch(IOException e)