midlet的线程安全检查变量

时间:2009-09-25 15:40:19

标签: java multithreading chat midlet multiplayer

我正在客户端编写一个j2me游戏,它连接到用java编写的服务器。这个游戏将具有聊天功能,但作为辅助功能。

对于连接到服务器的每个midlet,都会生成服务器游戏线程。这些线程在它们之间进行通信,以便它们可以同步并写入服务器中的一系列配置文件。现在,如果在其中一个midlet中编写了聊天消息,则会将其传递给管理套接字通信并发送到服务器的客户端线程。在服务器中,通知同一游戏的所有其他玩家,并将聊天消息传递给所有玩家。因此,每个服务器线程(但最初发送消息的用户之一)向其对应的客户端线程发送消息。

这是我的问题。如何向每个midlet发出信号,以便它知道有新的传入消息?

我想过制作一个线程来轮询客户端通信线程,看是否有任何新消息。但是,我怎么能从midlet知道,而不是半途而废呢?理想情况下,我想直接读取客户端通信线程中的字符串,但该字符串可能正在写入,因此我需要一个线程来访问它并与之同步。

你们中的任何人都可以伸出援手吗?我真的不知道该怎么做,看起来这应该是非常简单的......

提前致谢

2 个答案:

答案 0 :(得分:1)

不幸的是,由于移动电话一般不会花费大部分时间连接到互联网,唯一可用的推送机制是通过PushRegistry API的短信/彩信。真正推送的真正问题在于服务器需要一种识别客户端的方法,而您不能依赖移动网络运营商为您的手机提供的临时IP地址。

如果您打算使用HTTP连接通道,则需要轮询服务器以获取聊天消息更新。但是,有一些方法可以减少这种情况。

如果您的游戏应该定期向/从服务器发送/接收数据,您可以将聊天数据捆绑到http请求和回复正文中的自己的协议中。

从技术上讲,您可以使用SMS推送来触发数据的HTTP检索,但这可能会变得昂贵。

关于在您的MIDlet java代码中正确使用synchronized关键字,我建议您提出一个更精确的问题,包含代码示例,因为它是一个不同的问题域。

答案 1 :(得分:0)

你几乎不想要民意调查。在每种情况下,轮询都是几乎的资源浪费。根据您的建议,每次轮询线程触发时,您都将进行上下文切换,然后还需要几个周期来检查是否应该处理请求。添加轮询到网络代码,你正在谈论一些严重的延迟。

使用Observer模式可以轻松解决您遇到的问题。 (Here是来自patterndepot.org的这种模式的pdf解释。Here是对JavaWorld.com的解释。此外,在多线程环境中工作,轮询具有上下文切换的缺点,和同步,然后发现你不需要花费这些资源来检查你的消息总线。请查看使用java.util.concurrent包中的并发集合来存储邮件。

最后,您的通用架构听起来需要在服务器端进行一些重新设计。如果您计划用户负载较高,因为为每个用户引入新的中间层处理线程最终会导致服务器性能下降,因为您有更多的上下文切换,并且任务变得更加强大。