A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

为大牛指导指导,网络编程中的服务器端,为什么一句代码放的位置不对,就会出现内存使用特别大,甚至卡死电脑的问题?代码如下
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();
          }
     }
}


8 个回复

正序浏览
icris 中级黑马 2014-8-21 15:56:12
9#
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.                 }
复制代码

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

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

回复 使用道具 举报

这个意思啊,懂了,感谢!
回复 使用道具 举报
  把你while(true)   中额   new Thread(){}  拿出去。
回复 使用道具 举报
ssy1939 发表于 2014-8-20 22:14
我就启动服务器这块的代码,没开客户端,线程貌似没启动啊

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


没有不启动的理由啊,accept是在线程启动后才堵在那的,一个线程一个。
可以把线程写成 class MyThread extends Thread{} ,就清楚了
回复 使用道具 举报
icris 发表于 2014-8-20 16:58
放到线程里面就是不停开新线程,每个线程都堵在那,CPU有多快卡得就有多快 ...

我就启动服务器这块的代码,没开客户端,线程貌似没启动啊
回复 使用道具 举报
放到线程里面就是不停开新线程,每个线程都堵在那,CPU有多快卡得就有多快
回复 使用道具 举报
放到线程里面就是不停开新线程,每个线程都堵在那,CPU有多快卡得就有多快
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马