我是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线程中调用此类时,主线程上的其他任何类都没有接收到这些事件。如果我删除“synchronized”关键字,则会收到/重复某些事件/生成错误。
如果不从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();
}
...
}
}
让客户端侦听某些命令并调度事件以响应的最佳做法是什么?