Java:将数据从一个线程传递到另一个线程

时间:2012-10-12 17:30:17

标签: java udp

我正在创建基于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线程?我是否必须向自己拍摄数据报,或者我能否以某种方式在代码中传达此信息?

3 个答案:

答案 0 :(得分:1)

您的SEND线程应具有您应该能够从RECEIVE线程访问的公共(可访问)方法(如果可能,可以同步)。您可以使用此方法创建一个布尔标志,字符串消息等,您应该始终在.send(yourPacket)之前阅读;来自你的SEND帖子。

答案 1 :(得分:1)

假设两个线程彼此没有引用,创建第三个singleton类,它读取/发送线程(类)引用,具有volatile成员字段来存储状态数据想要共享,哪个有synchronized访问权限。

volatile关键字与同步访问相结合,可确保另一个线程可以看到一个线程对该字段所做的更改。如果没有这个,由于java内存模型规范,可能无法看到更改。

编辑:

在“关注点分离”设计指南之后,让读/发线程彼此了解并使用第三类来协调他们的活动/行为会更好。将读取/发送类的方法添加到stop()start()等,并从其他类中调用这些方法。

使用单独的类也允许:

  • 通过其他方式进行行为控制,例如管理网页上的“停止发送”按钮
  • 允许每种类型的多个线程,但仍然通过中心点进行适当的控制,也许使用这样的线程池(没有单独的类,你会有一个多对多的噩梦和许多没有任何代码的代码与手头的工作有关:即结束和接收)
  • 更容易测试您的工人类,因为他们做得更少,更专注
  • 将它们独立移植/嵌入以供其他用途

答案 2 :(得分:0)

在您的READ方法中有一个代码可以读取的成员变量,并根据该变量更改SEND方法。