我正在创建基于UDP的聊天客户端。主要结构是有一个客户端注册的服务器,客户端也可以请求与服务器注册的另一个客户端建立连接。客户端使用伪代码构造如下:
public UDPClient() {
// Create datagram socket
// Execute RECEIVE thread using datagram socket above
// Execute SEND thread using datagram socket above
}
这个想法是让发送和接收在不同的线程上执行,这样我就不会在接收上阻塞I / O.这两个线程在其运行方法中都有循环,允许您不断发送和接收消息。我遇到的问题是这个。如果RECEIVE线程上有一条消息改变了我的SEND应该执行的方式,我该如何将其传达给SEND线程?我是否必须向自己拍摄数据报,或者我能否以某种方式在代码中传达此信息?
答案 0 :(得分:1)
您的SEND线程应具有您应该能够从RECEIVE线程访问的公共(可访问)方法(如果可能,可以同步)。您可以使用此方法创建一个布尔标志,字符串消息等,您应该始终在.send(yourPacket)之前阅读;来自你的SEND帖子。
答案 1 :(得分:1)
假设两个线程彼此没有引用,创建第三个singleton类,它读取/发送线程(类)引用,具有volatile
成员字段来存储状态数据想要共享,哪个有synchronized
访问权限。
volatile
关键字与同步访问相结合,可确保另一个线程可以看到一个线程对该字段所做的更改。如果没有这个,由于java内存模型规范,可能无法看到更改。
在“关注点分离”设计指南之后,不让读/发线程彼此了解并使用第三类来协调他们的活动/行为会更好。将读取/发送类的方法添加到stop()
,start()
等,并从其他类中调用这些方法。
使用单独的类也允许:
答案 2 :(得分:0)
在您的READ方法中有一个代码可以读取的成员变量,并根据该变量更改SEND方法。