编程语言
首页 > 编程语言> > 使用Guava EventBus进行Java多线程处理

使用Guava EventBus进行Java多线程处理

作者:互联网

我正在使用番石榴事件总线.我有一个类似服务器的对象应该一直在运行,监听要发布给b us的事件.所以在junit测试中(MyObject是测试中的类),我在它自己的线程中创建它来模拟这个并阻止阻塞:

  @Test    
  public void test() {
      EventBus eventBus = new EventBus();

      Thread thread= new Thread() {
         @Override
         public void run()
         {
            logger.debug("Creating new thread");
            MyObject myObject = new MyObject(eventBus);
         }
      };

      thread.start();
      ...
  }

一切都很好,myObject是在自己的线程Thread1中创建的.然后,我在测试中将事件发布到事件总线:

eventBus.post(triggerObject);

我发现的奇怪的事情是,我在MyObject类中的订阅方法的所有操作/日志记录都在主线程中再次执行. myObject等待来自某些其他部分的响应,这会阻止我的测试,因为它在主线程中.为什么会这样?我在EventBus或Java线程上做错了吗?

解决方法:

好吧,除了创建一个最终在堆中的对象(在线程之间共享)之外,你不会在创建的线程中做任何事情,但由于对它的引用是在运行后没有保持,所以它也会丢失.

myObject中的@Subscribe方法在调用eventBus.post(event)的同一个线程中调用;而不是在创建myObject的线程中.

The weird thing I am finding is that all the actions/logging from my subscribed method inside of MyObject class are executing in the main thread again

如果你的MyObject类有一个@Subscribe方法,为什么它需要构造函数中的EventBus实例?你可能想要

MyObject myObject = new MyObject();
eventBus.register(myObject);`

而不是MyObject myObject = new MyObject(eventBus);

标签:java,multithreading,guava,event-bus
来源: https://codeday.me/bug/20190612/1224745.html