黑马程序员技术交流社区

标题: 网络编程写服务器代码时的一个问题,为什么电脑会卡死... [打印本页]

作者: ssy1939    时间: 2014-8-20 15:44
标题: 网络编程写服务器代码时的一个问题,为什么电脑会卡死...
为大牛指导指导,网络编程中的服务器端,为什么一句代码放的位置不对,就会出现内存使用特别大,甚至卡死电脑的问题?代码如下
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

public class Server_Test {

        /**
         * @param args
         * @throws IOException
         * @throws UnknownHostException
         */
        public static void main(String[] args) throws UnknownHostException, IOException {
          final ServerSocket server = new ServerSocket(9000);
          while (true) {
                     final Socket socket = server.accept();   //这一句
                     new Thread(){
                      public void run(){
                               
                      try {
                                  //将上面这一句放在这,为什么会内存使用特别大,甚至卡死电脑的呢?  搞不明白,电脑挂了好几次了都
                                  //Socket socket = server.accept();  
                                               
                                  BufferedReader br = new BufferedReader
                                  (new InputStreamReader(socket.getInputStream()));
                                  PrintStream ps = new PrintStream(socket.getOutputStream());
                                  ps.println("hello!");
                                  System.out.println(br.readLine());
                                  ps.println("helloworld");
                                  socket.close();
                          } catch (IOException e) {
                                               
                                    e.printStackTrace();
                           }
                               
                      }
               }.start();
          }
     }
}



作者: icris    时间: 2014-8-20 16:58
放到线程里面就是不停开新线程,每个线程都堵在那,CPU有多快卡得就有多快
作者: paul.li    时间: 2014-8-20 17:27
放到线程里面就是不停开新线程,每个线程都堵在那,CPU有多快卡得就有多快
作者: ssy1939    时间: 2014-8-20 22:14
icris 发表于 2014-8-20 16:58
放到线程里面就是不停开新线程,每个线程都堵在那,CPU有多快卡得就有多快 ...

我就启动服务器这块的代码,没开客户端,线程貌似没启动啊
作者: icris    时间: 2014-8-21 10:25
ssy1939 发表于 2014-8-20 22:14
我就启动服务器这块的代码,没开客户端,线程貌似没启动啊

简化如下:
  1. while(true){
  2.     new Thread().start();
  3. }
复制代码


没有不启动的理由啊,accept是在线程启动后才堵在那的,一个线程一个。
可以把线程写成 class MyThread extends Thread{} ,就清楚了
作者: masai158    时间: 2014-8-21 10:28
  把你while(true)   中额   new Thread(){}  拿出去。
作者: ssy1939    时间: 2014-8-21 12:39
icris 发表于 2014-8-21 10:25
简化如下:

这个意思啊,懂了,感谢!
作者: ssy1939    时间: 2014-8-21 12:53
icris 发表于 2014-8-21 10:25
简化如下:

我又想了一下,貌似不对啊,我说的是这句,Socket socket = server.accept();这个是定义服务器的,用于接受      用while时为了多个客户端可以同时连接服务端  和  Socket socket = server.accept();   又没关系


作者: icris    时间: 2014-8-21 15:56
ssy1939 发表于 2014-8-21 12:53
我又想了一下,貌似不对啊,我说的是这句,Socket socket = server.accept();这个是定义服务器的,用于接 ...

两种情况分别简化如下:
  1.                 while (true) {
  2.                         final Socket socket = server.accept();
  3.                         new MyThread() {}.start();
  4.                 }
复制代码

第一种,循环开始,堵在这了,要接收一个客户端才能开线程。开出来就是另一个线程了,主线程循环回来继续堵在这。
  1.                 while (true) {
  2.                         new MyThread() {}.start();
  3.                 }
复制代码

第二种,主线程循环开始,开一个线程,结束,循环回来,再开一个线程,无限循环,一直开线程。线程里面都在堵着,都不会结束,就会卡住了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2