socket跨线程使用
来源:10-12 心跳包构建与消费调度-2
慕婉清7375043
2019-10-17
socket可以跨线程使用吗?比如主线程用来读socket接收数据,另外一线程用来写socket发送数据;如果可以,一般什么情况下把socket的读和写放在不同的线程里进行处理!如果将socket的读和写放在一个线程进行操作可能引发的问题有哪些?
写回答
1回答
-
Socket是线程安全的,输入输出流是数据交叉的非线程安全的。
你可以把一个Socket的输入流交给一个线程,输出流交给另外一个线程这是可以的,咱们的课程也有这个demo的哦。就是同时可以实现发送和接收这是OK的。
但是你不能把输出流同时丢给两个及其以上的线程,这会导致数据错乱的问题,比如A线程发送了一部分数据,B又发送,结果总数据就是:
ABABCA, 而接收方接收到的也是这样的数据就无法解析为:AAA BB C.
同理你页不能把收入流同时丢给2个及其以上的线程,比如现在网络中有一段有意义的数据:
123456
现在3个线程同时去去读,则A可能读取到:126,B可能读取到:3,C可能读取到:5.
对于A、B、C三个线程来说各自读取的数据都是无意义的脏数据了。
而你说的读取和写都放一个线程那是没啥问题的,唯一的问题就是如果读取阻塞了,此时想要输出数据就不能立即输出。就是会相互阻塞,不能做到双工,只能交替进行。00
相似问题