请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

用UDP协议多线程的向多个终端发送并接受信息

老师您好,问题是这样的,服务器根据一组终端号在线程池中创建发送线程,并一直运行着,直到获得接受线程的值后,做相对应的处理再结束。终端在收到发送线程的信息后,会向服务器中绑定了固定端口的接受线程发送对应的信息,接受线程再将信息传给对应的发送线程,且接收线程将一直运行着。由于接受线程只能有一个,所以本来的想法是在接受线程中new一个全局静态hashMap,根据终端号将信息put进去,对应的接受线程get到信息后在做处理。问题是由于接受线程开启后就不会关闭,所以第一组随着接受线程一起启动的发送线程可以get到map的信息,但是下一组后启动的就得不到信息了,之后为了解决问题就恶补了老师的这门课,受益匪浅,但是我还是不明白是不是因为接受线程是跟第一组发送线程一起execute的,第二组发送线程通过线程池execute后,他们跟接受线程并不在一个工作内存中,所以才取不到map的值?将hashMap换成hashTable还是用并发容器好呢?

正在回答

1回答

你好,我仔细看了几遍这个问题,感觉可能还是没完全明白问题的所有点。最好你能在群里找一下我,我们详细交流一下看看。

基于我目前的理解,来回答一下你现有的问题:

1)“接受线程中new一个全局静态hashMap”,感觉这里应该不是全局静态的,或者全局静态的应该在项目启动时就初始化好才对。这里的根本问题是,虽然你这边第一次处理后线程还一直存在,但之后过来的请求已经属于新的线程了,只是复用之前的连接去处理(没看到你的代码,猜测。。。)。从你的描述中,我们至少可以知道,这里涉及端和服务器,数据从端到服务器,服务器本身是不知道该使用哪个线程去处理的。这个和我们平时发普通的http请求很像,tomcat都会创建新的线程,让应用去处理,应用可以继续复用之前的一些内容,比如数据库连接、线程池的线程等等,但本身这个线程是不一样的。

2)如果多线程涉及到资源共享的处理,那么hashMap和hashTable基本上都不会用,而是选择并发容器ConcurrentHashMap.

0 回复 有任何疑惑可以回复我~
  • 提问者 慕九州8947824 #1
    谢谢老师,刚好下一课看到ConcurrentHashMap,我这个表达能力确实不行。。。不过您的猜想是对的,我就是卡在新的发送线程收不到接受线程中Map的信息,我再自己想想,不过因为这个问题看了您的这门课,确实收获很多。
    回复 有任何疑惑可以回复我~ 2018-08-19 11:23:17
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信