Socket socket = server.accept();
new Thread()
{
    ...处理socket的请求相关
}.start();
我想每个请求就开一个线程, 请问一下这个在实际使用中会不会遇到啥问题??或者有没有更好的解决方案,谢谢大家啊~~

解决方案 »

  1.   

    没有问题的,一般是这样处理的,要注意的是结束通信的时候要关闭socket。
      

  2.   

    如果并发小没问题,并发数多了就崩溃了一般都使用异步io来做,有现成的框架,比如:netty。
      

  3.   


    请问一下, 这样每一个在线的用户, 都会消耗一个thread 。  一般服务器能抗住多少用户?不知道有没有相关经验可以分享一下呢
      

  4.   

    整个还要置于可控循环中,如果是为了持续接受连接的话。
    ServerSocket再设置一下超时以便长时无连接情况下退出。
      

  5.   

    上个月做了个多线程网络聊天程序 可以给楼主点建议  觉得这样好些
     new Thread() {  Socket socket = server.accept();
       ...处理socket的请求相关 }.start(); ,因为new一个新线程服务器端就accept();然后只要及时调用close()就OK 不然线程太多很占内存 我们是在自己的电脑模拟的服务器和客户端 所以那点内存是不够的,不用担心这个问题
      

  6.   

    上个月做了个多线程网络聊天程序 可以给楼主点建议  觉得这样好些
     new Thread() {  Socket socket = server.accept();
       ...处理socket的请求相关 }.start(); ,因为new一个新线程服务器端就accept();然后只要及时调用close()就OK 不然线程太多很占内存 我们是在自己的电脑模拟的服务器和客户端 所以那点内存是不够的,不用担心这个问题
    你这样写。是只在一个线程里面做吗?
      

  7.   

    感觉实现runnable接口要比这个效果好。
      

  8.   

    上个月做了个多线程网络聊天程序 可以给楼主点建议  觉得这样好些
     new Thread() {  Socket socket = server.accept();
       ...处理socket的请求相关 }.start(); ,因为new一个新线程服务器端就accept();然后只要及时调用close()就OK 不然线程太多很占内存 我们是在自己的电脑模拟的服务器和客户端 所以那点内存是不够的,不用担心这个问题
    你这样写。是只在一个线程里面做吗?

    对对于服务器端可以给所有连接它的用户发送信息 然后 客户端与客户端之间的聊天也能通过服务器发送。。其实发送消息都在服务器,所有 服务器发送消息的方法要加锁synchronized好吧 这好像歪楼了回到楼主问题  建了个类用来服务器端的等待客户端连接的线程类  还有服务器界面主类,监听客户端收发信息的线程类,这样基本对于服务器的要求满足了对于每个连接的客户端都new一个新连接的线程 就够了服务器端有专门的监听类就知道有哪些客户端连着不知道楼主看懂我说的了没?
      

  9.   

    上个月做了个多线程网络聊天程序 可以给楼主点建议  觉得这样好些
     new Thread() {  Socket socket = server.accept();
       ...处理socket的请求相关 }.start(); ,因为new一个新线程服务器端就accept();然后只要及时调用close()就OK 不然线程太多很占内存 我们是在自己的电脑模拟的服务器和客户端 所以那点内存是不够的,不用担心这个问题
    你这样写。是只在一个线程里面做吗?

    对对于服务器端可以给所有连接它的用户发送信息 然后 客户端与客户端之间的聊天也能通过服务器发送。。其实发送消息都在服务器,所有 服务器发送消息的方法要加锁synchronized好吧 这好像歪楼了回到楼主问题  建了个类用来服务器端的等待客户端连接的线程类  还有服务器界面主类,监听客户端收发信息的线程类,这样基本对于服务器的要求满足了对于每个连接的客户端都new一个新连接的线程 就够了服务器端有专门的监听类就知道有哪些客户端连着不知道楼主看懂我说的了没?
    对于每个连接的客户端都new一个新连接的线程 就够了到头来还是得这样子搞啊。
      

  10.   

    这种问题,有一个常用的解决方案,就是“线程池” Thread Pool Pattern.概念上,可以去读 IBM 的这篇介绍:
    线程池的介绍及简单实现 http://www.ibm.com/developerworks/cn/java/l-threadPool/IBM 的这篇介绍使用的是 synchronization 的方法。但是Java SE 1.5 以后,可以直接用 java.util.concurrent.Executors 的函数 newFixedThreadPool():
    http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int)J2EE 上的话,Web Application Server 都内部使用 thread pool. 应用在EJB container内不能自制线程. Socket 接口,一般要引入 connector.