背景:
      有一个GUI程序,通过socket接收客户端发送的内容,然后再发送给其它地址。实现:      使用concurrent包中的pooledExecutor来实现一个线程池。由线程池中的线程负责接收到数据的
      处理。代码:
      PooledExecutor pooledExecutor = new PooledExecutor(10);
      ServerSocket serverSocket = new ServerSocket(8999);
      while(true) {
        Socket socket = serverSocket.accept();
        pool.execute(new Runnable() {
          public void run() {
              new Handler().process(socket);
          }
        });      }
      
      class Handler {
         void process(Socket s) {
          
         }
      }现在的问题是:    在Handler类中,发送操作可能很费时,这样线程迟迟不能回收,导致线程池中可用的线程很少,
    从而不能接收更多的其它用户请求。    能否这样做:
    线程池中的线程收到客户端请求后,将接收内容放入线程池维护的队列后,马上返回。    然后再实现一个线程池,专门读取第一个线程池维护的队列,然后将内容发送出去。    不知道这样是否可行?
    如果可行,第一个线程池怎么操作自己的队列?
    第二个线程池又如何和第一个线程池维护的队列通讯?    第一次使用concurrent包,请高手指点。谢谢。    

解决方案 »

  1.   


    发现我的理解有误。线程池中绑定的消息队列中存放的应该是task,而不是数据。在这个应用中,两个线程池需要一个线程安全的队列来通讯?
      

  2.   

    如果socket只接受数据,那么把接收的数据放入缓存,用多线程处理。
    如果socket需要多次交互,那么你得多开线程(500左右),并且优化process。
      

  3.   

    如果socket只接受数据,那么把接收的数据放入缓存,用多线程处理。
    如果socket需要多次交互,那么你得多开线程(500左右),并且优化process。
      

  4.   

    其实对于网络数据流的读写可以考虑使用nio的异步IO支持。如果用线程池的话,延迟时间长久干脆多开几个线程。(需要不断通过测试找出最佳的线程数量)