我在服务器端监听了两个端口,这两个端口都是要对多个线程进行处理的
在对多线程的处理上我采用的是executorservice来处理
现在问题是我在对这两个端口处理的时候都要用到executorservice,请问在一个程序里面能同时用多个executorservice吗

解决方案 »

  1.   

    executorservice是用来做线程池的
    这个和端口监听有关吗我觉得你的设计上有问题,端口监听这种动作应该是阻塞-处理-阻塞的模式
    线程池的处理概念是对单个任务的处理你应该考虑下自己的设计了
      

  2.   

    我是这么设计的
    server1 = new ServerSocket(port1);
    server2 = new ServerSocket(port2);
    //然后用两个线程来处理
    thread1 = new ServerThread(server1);
    thread2 = new ServerThread(server2);thread1.start();
    thread2.start();
    //在ServerThread里面用的是executorservice来进行多线程处理socket = server.accept();
    //有一个处理线程handler(socket);
    然后用executorservice.execute来处理handler我的意思是这样的话,我就会new 两个executorservice,他们之间会不会有什么影响这样的设计有问题吗
      

  3.   

    事实上 我觉得是有问题的
    在于线程池来说,他针对的是任务
    每个任务,在理论上来说应该是有自身独立的上下文环境
    每个任务只执行一次
    所以在线程池的任务内就不应该有while循环了,那样就失去使用线程池的意义了
    你把socket对象直接传入的话,还得安排核心线程的Lock在于ServerSocket来说,每接收一次socket,应该给予一个单独的线程进行处理,而不是线程池的任务
    至于多个线程池,是不会有相互影响的,每个线程池会负责维护自身的核心线程和任务队列
      

  4.   


    楼上的说的有道理
    但是如果在对每个socket = server.accept();进行处理的时候都用new Thread(socket).start的话,而不用线程池的话,效率是不是要低一些呢,我对于每个socket的处理是要传送一些数据,大概在100个字节左右吧,而且在其处理任务里面需要采用同步机制,因为采用了一个hashmap来存储每个socket
      

  5.   

    没有必要使用两个 ExecutorService,用一个然后让这两个共享这个就可以了。