问题描述
小菜最近碰到一个问题,采用多线程socket通信模式,有多个客户机可能发送处理请求。server端的serversocket每接受一个任务请求,就往任务队列添加一个任务,然后返回任务状态给客户端。这时候有另外一个任务处理线程,只要任务队列不为空就取一个出来处理。整个流程就是这样,应该采用什么方式来设计。我把任务处理线程也设计成阻塞式线程了,结果就是只有一个线程能执行。。
解决方案
解决方案二:
应该用生产者消费者模式来设计吧,具体实现几句话说不清楚,楼主自己摸索吧,任务处理线程这地方有点问题,任务处理线程是阻塞的没问题,因为不过它应该是用来调度的而不是由他来处理,就是只要任务队列不为空就取一个出来处理。这里不是取出来就处理,这样当然就编程单线程了,应该是只要任务队列不为空就取一个出来然后开一个处理线程进行处理。你的任务线程是阻塞的,但是处理线程是多线程就可以了。
解决方案三:
看你客户socket的数量了,同步方式理解和代码写起来要简单,但是占用大量的系统资源,客户不多的时候可以用同步方式,如果客户达到几千上万的用NIO的异步方式。
解决方案四:
哈哈,对于两个阻塞式线程,只能用sleep让两个线程同时工作了。你说的NIO一部方式还不是很了解,有时间好好了解下
解决方案五:
首先说一下,楼主前面的设计是没有问题的,但是任务处理线程处理完一个任务,要把这个任务从任务队列里清楚,然后下一次再从队列里取出第一个任务继续处理,这样没有问题。然后可以提一个建议,楼主可以楼主可以多创建几个处理任务的线程,同时处理任务,这样就设计线程同步问题的处理,楼主需要使用线程锁来解决线程同步问题,相关问题,可以到网上搜一下,这方面的例子有很多。
解决方案六:
引用楼主fnststart的回复:
我把任务处理线程也设计成阻塞式线程了,结果就是只有一个线程能执行。
总体思路没啥问题。楼主会用线程池么?起步:监听专门用一个线程,也可以理解为分发线程;监听到新的连接请求后,就将这个Socket作为一个任务扔给线程池。进阶:同时注意线程池的任务数量是否太多,如果太多了要不要适量增加线程池的线程数;如果更多的情况下,是否要拒绝连接请求以保证服务器端压力不要太大;还有是否要注意闲置连接(连接建立后啥事不干);还有是否要注意长时间忙碌连接(可能死循环了之类的)。