如何使用Rx运行并发任务队列?

时间:2018-01-29 19:56:14

标签: java concurrency rx-java rx-java2

我找到了很多关于它的例子,并且不知道那里的'正确'实现是什么。

基本上我有一个对象(让我们称之为NBAManager),这个对象有一个方法public Completable generateGame()。我的想法是generateGame方法被调用很多次,我想以顺序方式生成游戏:我在考虑并发队列。我提出了以下设计:我为NBAService: service创建NBAManager的单例实例,generateGame()的主体将如下所示:

public Completable generateGame(RequestInfo info) return service.generateGame(info);

所以基本上我会放弃那个可完成的结果。在NBAService对象的内部,我将有一个队列(一个并发的队列,因为如果有poll(),我希望有机会add(request)generateGame() 1}} NBAManager处理请求的早期请求之一)。我对此感到困惑:

  • 以Rx方式编写这样的作业队列的正确方法是什么?它有很多例子。你能给我发一个好的实施链接吗?
  • 如何处理队列执行的逻辑?我相信如果只有一份工作我们必须执行,如果有很多,那么我们只需添加它就可以了。如何在没有 runnable 的情况下控制它?我正在考虑使用主题

谢谢!

1 个答案:

答案 0 :(得分:1)

有多种方法可以实现这一点,您可以选择应该调用多少RxJava。最少的参与可以使用单线程ExecutorService作为"队列"和CompletableSubject延迟完成:

class NBAService {
    static ExecutorService exec = Executors.newSingleThreadedExecutor();

    public static Completable generateGame(RequestInfo info) {
        CompletableSubject result = CompletableSubject.create();
        exec.submit(() -> {
            // do something with the RequestInfo instance
            f(info).subscribe(result);
        });
        return result;
    }
}

如果您想在订阅Completable时触发执行,那么更复杂的解决方案就是。在这种情况下,您可以使用create()subscribeOn()

class NBAService {

    public static Completable generateGame(RequestInfo info) {
        return Completable.create(emitter -> {
            // do something with the RequestInfo instance
            emitter.setDisposable(
                f(info).subscribe(emitter::onComplete, emitter::onError)
            );
        })
        .subscribeOn(Schedulers.single());
    }
}