当前位置: 首页 > 知识库问答 >
问题:

使用Guava EventBus实现Java多线程

包嘉懿
2023-03-14

我正在使用番石榴事件总线。我有一个类似服务器的对象,它应该一直在运行,监听要发布给b用户的事件。所以在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线程上做错了什么?

共有1个答案

姬和豫
2023-03-14

在创建的线程中,除了创建一个最终在堆(线程之间共享)中结束的对象之外,您什么也不做,但是由于对它的引用在运行后不被维护,所以它也丢失了。

在调用EventBus.Post(事件);的同一线程中调用MyObject中的@subscribe方法,而不是在创建MyObject的线程中。

奇怪的是,我发现MyObject类中的订阅方法的所有操作/日志记录都再次在主线程中执行

如果您的MyObject类有一个@subscribe方法,那么它为什么需要构造函数内部的EventBus实例呢?你可能想

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

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

 类似资料:
  • 本文向大家介绍使用java的HttpClient实现多线程并发,包括了使用java的HttpClient实现多线程并发的使用技巧和注意事项,需要的朋友参考一下 说明:以下的代码基于httpclient4.5.2实现。 我们要使用java的HttpClient实现get请求抓取网页是一件比较容易实现的工作: 要多线程执行get请求时上面的方法也堪用。不过这种多线程请求是基于在每次调用get方法时创建

  • 本文向大家介绍Java多线程实现Runnable方式,包括了Java多线程实现Runnable方式的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了Java多线程实现Runnable方式的具体方法,供大家参考,具体内容如下 (一)步骤  1.定义实现Runnable接口  2.覆盖Runnable接口中的run方法,将线程要运行的代码存放在run方法中。 3.通过Thread类建立线程对象

  • 本文向大家介绍java多线程实现文件下载,包括了java多线程实现文件下载的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java多线程实现文件下载的具体代码,供大家参考,具体内容如下 1、DownloadManager类  2、DownloadThread类 3、TestDownload测试类 代码已经测试可以运行! 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多

  • 本文向大家介绍使用.Net实现多线程经验总结,包括了使用.Net实现多线程经验总结的使用技巧和注意事项,需要的朋友参考一下 1.简述   一般一个程序一个进程,代码是存在进程中的,进程本身不执行代码, 执行代码的是线程。   一般一个进程里就一个线程。(一个商店就一个老板娘。)   进程就是在内存中开辟了一个空间。代码,图片。。等就存在这个空间里。代码线程去执行。   默认只有一个线程。 2.前台

  • 本文向大家介绍PHP使用Pthread实现的多线程操作实例,包括了PHP使用Pthread实现的多线程操作实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP使用Pthread实现的多线程操作。分享给大家供大家参考,具体如下: 希望本文所述对大家php程序设计有所帮助。

  • sellerDataList的大小=1000,sellerNames的大小=5000。 现在我想创建10个线程,并为每个线程分配相等的任务块。对于第一个sellerDataList,第一个线程应该获得500个名称的地址,第二个线程应该获得下一个500个名称的地址,依此类推。 完成这项工作的最佳方法是什么?