2

我是 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();
          }

          ...
      }
}

让客户端侦听某些命令并调度事件进行响应的最佳实践是什么?

4

0 回答 0