我是 Java 新手,并且对我正在开发的应用程序有所了解。这是我想要做的。
我有一个客户端/服务器设置,我使用 QuickServer 作为服务器。我把它弄好并且运行良好。它使用 "\r"\n" 逐行发送和接收命令,因此我的客户端位于
public class CommandHandler extends Thread {
public void run() {
while (connected) {
//read and write
if (command.equals("USERNAME")) {
AsynchEventBusSingleton.$().postEvent(new TellParentToGiveUN())
}
...
}
}
如果我不扩展 Thread,我的 GUI 会冻结,所以我认为 CommandHandler 需要它自己的线程。然而,问题是 AsyncEventBusSingleton。
public class AsyncEventBusSingleton {
private EventBus ebEventBus = null;
final static AsyncEventBusSingleton aebInstance = new AsyncEventBusSingleton();
public synchronized static AsyncEventBusSingleton $() {
return aebInstance;
}
private AsyncEventBusSingleton() {
ebEventBus = new AsyncEventBus(Executors.newCachedThreadPool());
}
public void registerSubscriber(Object subscriber) {
ebEventBus.register(subscriber);
}
public void unRegisterSubscriber(Object subscriber) {
ebEventBus.unregister(subscriber);
}
public synchronized void postEvent(Object e) {
ebEventBus.post(e);
}
}
当我在 CommandHandler 线程中调用这个类时,主线程上的其他类都没有接收到事件。如果我删除“同步”关键字,则接收/重复某些事件/生成错误。
如果不从 CommandHandler 抛出事件,一切似乎都可以正常工作,而是传递实例化 CommandHandler 的类的引用并让它调用 CommandHandler 的方法:
public class ServerConnectionHandler {
private CommandHandler commandhandler;
public void ConnectToServer() {
commandhandler = new CommandHandler(this);
}
public void dispatchServerEvent() {
commandhandler.sendResponse("MyUN");
}
}
public class CommandHandler extends Thread {
private PrintWriter printWriter;
private ServerConnectionHandler serverconnectionhandler;
public sendResponse(String s) {
this.printWriter.println(s);
}
public void run() {
while (connected) {
//read and write
if (command.equals("USERNAME")) {
this.serverconnectionhandler.dispatchServerEvent();
}
...
}
}
让客户端侦听某些命令并调度事件进行响应的最佳实践是什么?