我想使用 Swing 作为界面用 Java 编写一个聊天应用程序。
我想出了一个主意(在疯狂程序员 https://stackoverflow.com/users/992484/madprogrammer),但我不确定这是否是解决此问题的最佳方法。
那里有两个Blockinqueue
队列中的main
线程,一个用于传入消息,一个用于传出消息。
有四个线程,两个用于传出消息,两个用于传入消息,各一个用于处理 GUI 和套接字。
传出消息的线程:
-
ActionListener (Swing)
:当用户在 GUI 中单击“发送”时触发。线程将新消息添加到 Outgoing Queue 并触发notifyAll()
on it.
-
socketOutgoing
:可以访问套接字。睡觉,与wait()
在传出队列上,直到收到通知。通过套接字发送传出队列中的新消息,然后再次返回睡眠状态。
传入消息的线程:
-
socketIncoming:
可以访问套接字。不断检查是否有新的
套接字中的消息(如何?)。当有新消息时,将其添加到
传出队列和触发器notifyAll()
on it.
-
Swingworker displayIncoming
: 睡觉,与wait()
在传入队列上,直到收到通知。在 GUI 中显示新消息,然后再次返回睡眠状态。
虽然这在理论上是可行的,但为此拥有四个线程似乎有点混乱(而且不可靠)。
有没有更实用的解决方案?
未来读者请注意:我的描述socketIncoming
被误导了:不可能“连续检查套接字中的新消息”。
你打电话时ObjectInputStream#readObject()
,并且没有新消息,它只是等待或“阻塞”,直到新消息到达。无法事先检查是否有新消息到达。看到这个问题 https://stackoverflow.com/q/1501378/805556.
如果我正在考虑做类似的事情,我可能会设置两个队列,一个传出队列和一个传入队列。这些将用于“暂存”消息。
这个想法是传出消息将被放入传出队列中,并且当Thread
如果能够,它会弹出下一条消息并发送它。当队列为空时,它只会“等待”直到有新消息可用。
这个概念对于传入队列来说是相反的。这Thread
将读取一条消息并将其推送到传入队列中。
其他一些进程(可能是SwingWorker
)将监视队列并弹出它的下一条消息并将其与 GUI 重新同步。
你可能会发现Swing 中的并发 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/有一定用处。
不过,底层协议的实际工作方式将决定更多细节
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)