Обработчики, зарегистрированные с помощью асинхронной шины событий, выполняются в любом потоке, который предоставленный Executor
выбирает для их выполнения, не обязательно в рабочем потоке.
Я создал реализацию Executor
, который запускает вещи в потоке очереди событий.Это довольно просто:
public class EventQueueExecutor implements Executor {
@Override public void execute(Runnable command) {
EventQueue.invokeLater(command);
}
}
Затем вы можете просто создать свой EventBus
с этим:
EventBus eventBus = new AsyncEventBus(new EventQueueExecutor());
Тогда все обработчики будут выполнены в потоке очереди событий.
Редактировать:
Пример пересылки событий:
public class EventForwarder {
private final EventBus uiEventBus;
public EventForwarder(EventBus uiEventBus) {
this.uiEventBus = uiEventBus;
}
// forward all events
@Subscribe
public void forwardEvent(Object event) {
uiEventBus.post(event);
}
// or if you only want a specific type of event forwarded
@Subscribe
public void forwardEvent(UiEvent event) {
uiEventBus.post(event);
}
}
Просто подпишите это на своей главной шине событий и опубликуйте все события на главной шине событий, ноподписать все компоненты пользовательского интерфейса на шину событий пользовательского интерфейса.