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

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

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

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

3个回答

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

romanticRose
青春没有彩排丶 怎么解决阻塞问题呢
3 年多之前 回复

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

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

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

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

可以尝试使用

ExecutorService cachedThreadPool = Executors.newCachedThreadPool(4);

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐