romanticRose
青春没有彩排丶
采纳率60%
2017-04-18 05:48 阅读 1.2k
已采纳

Java多线程服务器问题,executorservice的用法

17

创建了一个Java多线程服务器,通过socket连接不断接收大量设备(客户端)传输过来的信息

         // 创建可以容纳4个线程的线程池  
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);  

当连接数达到4个时出现了阻塞状态,求解怎么解决,怎么在完成一次数据解析后释放工作线程接收下一个连接,有点卡壳

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    oyljerry oyljerry 2017-04-18 06:22

    这是因为你的线程池只有4个线程,这样当4个线程都在工作的时候,你新来的任务就要阻塞等待其他线程完成工作才能进入工作状态。
    你只要让你的工作线程函数完成任务后就返回,不要阻塞在里面

    点赞 评论 复制链接分享
  • yizishou yizishou 2017-04-18 07:46

    一个银行网点有四个窗口,每个窗口有一个业务员处理业务。你的业务员从设计上就不是一次性的,业务员会一直在窗口上等待业务,就算你的银行还有100个待命业务员,但是这100个业务员根本没机会上窗口。除非处理完一个业务就杀死一个业务员,然后空出柜台让下一个业务员上来,但是这样的设计没太大意义,因为你的窗口就四个,总是换业务员不会增加你这个银行网点的效率,反而会增加更换业务员的开销。如果你的线程池就四个位置,那就创建四个线程扔进去就好了

    点赞 评论 复制链接分享
  • qq_22857293 小祝特烦恼 2017-04-19 08:25

    线程池大致会有三四种用法。
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);

    你用的这种是堵塞性线程池,也就是当线程数量为4的时候,不会再产生新的线程,知道跑完一个后,才会产生新的线程去执行任务。

    看你的留言事项解决堵塞。

    可以尝试使用

    ExecutorService cachedThreadPool = Executors.newCachedThreadPool(4);

    这种用法是当有第五个线程任务来临的时候,会新new个线程去跑,从而解决堵塞。

    在内存不大的情况下,容易导致内存溢出。

    点赞 评论 复制链接分享

相关推荐