【发布时间】:2014-01-21 02:03:03
【问题描述】:
我想用 Java 编写一个使用 Swing 作为接口的聊天应用程序。
我想出了一个想法(在MadProgrammer 的帮助下),但我不确定这是否是最好的方法。
main 线程中有两个Blockinqueue 队列,一个用于传入消息,一个用于传出消息。
有四个线程,两个用于传出消息,两个用于传入消息,一个用于处理 GUI 和套接字。
传出消息的线程:
-
ActionListener (Swing):当用户在 GUI 中单击“发送”时触发。该线程将新消息添加到 Outgoing Queue 并在其上触发notifyAll()。 -
socketOutgoing:可以访问套接字。休眠,wait()在 Outgoing Queue 上,直到收到通知。通过套接字在 Outgoing Queue 中发送新消息,然后再次进入睡眠状态。
传入消息的线程:
-
socketIncoming:可以访问套接字。不断检查新的 套接字中的消息(如何?)。当有新消息时,将其添加到 传出队列并在其上触发notifyAll()。 -
Swingworker displayIncoming:休眠,wait()在传入队列中,直到收到通知。在 GUI 中显示新消息,然后再次进入睡眠状态。
虽然这在理论上可行,但为此设置四个线程似乎有点混乱(而且不可靠)。
有没有更实用的解决方案?
未来读者请注意:我对@987654335@ 的描述有误:不可能“连续检查套接字中的新消息”。
当您调用ObjectInputStream#readObject() 并且没有新消息时,它只是等待或“阻塞”,直到有新消息到达。没有办法事先检查是否有新消息到达。 See this question。
【问题讨论】:
-
“不断检查套接字中的新消息(如何?)” 基本上是
while(true) { checkForMessage(); },但您不希望它完全失控地运行。您可能会查看ScheduledThreadPoolExecutor 和它的旧版本Timer 来以特定速率调度单个任务。 “为此使用四个线程似乎有点混乱(而且不可靠)” 多个线程使复杂任务远离 EDT 和 GUI 响应。 -
谢谢,我会调查的。
标签: java multithreading swing sockets