我有一些代码允许服务器生成一些地形,然后通过数据报包将该数据发送到单独的客户端程序。接收此数据的客户端的伪代码如下:
-client sends SYN message to server
-server responds with ACK message (using 2-step SYNACK)
-client sends request for terrain from x=0 to x=32
-server responds with 32 seperate packets, one for each x (to keep packet size small)
-client receives packets and puts data into an ArrayList
在我目前的解决方案中,客户端运行两个同时线程,一个用于将数据绘制到屏幕的图形线程,以及一个数据包接收器线程(因为数据报套接字中的.receive()函数挂起,直到收到数据包)
目前,如果32个地形包中的一个在图形更新方法运行时到达,则会发生并发修改异常。
我想到了两种可能的解决方案:
这些解决方案似乎都不合理,但两者都存在缺陷。我的问题是否有一个很好的解决方案,如果没有,那么上述哪种解决方案最好用?
答案 0 :(得分:4)
我建议使用Queue在线程之间传递数据,而不是List或Set。
如果您使用像ArrayBlockingQueue或ConcurrentLinkedQueue这样的并发队列,则这些队列都不会触发CME。
注意:我建议您避免使用Iterator,而是调用take()
或poll()
从队列中提取事件。