AsynchEventBus,Singleton,Threads和Java

时间:2014-08-21 15:46:45

标签: java singleton thread-synchronization event-bus

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

          ...
      }
}

让客户端侦听某些命令并调度事件以响应的最佳做法是什么?

0 个答案:

没有答案