用UDP协议多线程的向多个终端发送并接受信息
来源:9-2 并发最佳实践
![](http://img1.sycdn.imooc.com/user/54584c9c0001489602200220-100-100.jpg)
慕九州8947824
2018-08-18
老师您好,问题是这样的,服务器根据一组终端号在线程池中创建发送线程,并一直运行着,直到获得接受线程的值后,做相对应的处理再结束。终端在收到发送线程的信息后,会向服务器中绑定了固定端口的接受线程发送对应的信息,接受线程再将信息传给对应的发送线程,且接收线程将一直运行着。由于接受线程只能有一个,所以本来的想法是在接受线程中new一个全局静态hashMap,根据终端号将信息put进去,对应的接受线程get到信息后在做处理。问题是由于接受线程开启后就不会关闭,所以第一组随着接受线程一起启动的发送线程可以get到map的信息,但是下一组后启动的就得不到信息了,之后为了解决问题就恶补了老师的这门课,受益匪浅,但是我还是不明白是不是因为接受线程是跟第一组发送线程一起execute的,第二组发送线程通过线程池execute后,他们跟接受线程并不在一个工作内存中,所以才取不到map的值?将hashMap换成hashTable还是用并发容器好呢?
1回答
-
你好,我仔细看了几遍这个问题,感觉可能还是没完全明白问题的所有点。最好你能在群里找一下我,我们详细交流一下看看。
基于我目前的理解,来回答一下你现有的问题:
1)“接受线程中new一个全局静态hashMap”,感觉这里应该不是全局静态的,或者全局静态的应该在项目启动时就初始化好才对。这里的根本问题是,虽然你这边第一次处理后线程还一直存在,但之后过来的请求已经属于新的线程了,只是复用之前的连接去处理(没看到你的代码,猜测。。。)。从你的描述中,我们至少可以知道,这里涉及端和服务器,数据从端到服务器,服务器本身是不知道该使用哪个线程去处理的。这个和我们平时发普通的http请求很像,tomcat都会创建新的线程,让应用去处理,应用可以继续复用之前的一些内容,比如数据库连接、线程池的线程等等,但本身这个线程是不一样的。
2)如果多线程涉及到资源共享的处理,那么hashMap和hashTable基本上都不会用,而是选择并发容器ConcurrentHashMap.
012018-08-19
相似问题