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

Java 如何使用Rx运行并发任务队列?,java,concurrency,rx-java,rx-java2,Java,Concurrency,Rx Java,Rx Java2,我已经找到了很多关于它的例子,但不知道什么是“正确的”实现 基本上,我有一个对象(我们称之为NBAManager),这个对象有一个方法public Completable generateGame()。其思想是,generateGame方法被调用了很多次,我想按顺序生成游戏:我考虑的是并发队列。我提出了以下设计:我将为NBAManager创建一个NBAService:service的单例实例,generateGame()的主体如下所示: public Completable generateNa

我已经找到了很多关于它的例子,但不知道什么是“正确的”实现

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

public Completable generateName(请求信息)
返回服务。生成名称(信息)

所以基本上我会放弃这个完整的结果。在
NBAService
对象内部,我将有一个请求队列(一个并发队列,因为我想有机会
poll()
add(request)
,如果在
NBAManager
处理之前的一个请求时调用了
generateGame()
)。我被这个困住了:

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

谢谢

有多种实现方法,您可以选择调用多少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()


谢谢。但有一个问题:如果我特别想返回'NBAService::generateGame'中某个可完成函数的结果,它会起作用吗?我的意思是,我希望能够返回Completable.onError()等(我希望我错了,但在这些情况下,您编写的代码看起来无论发生什么,我都会返回onComplete()。基本上,对RequestInfo实例执行一些操作是另一个可完成的f(RequestInfo)func。所以我想调用return f(RequestInfo),而不仅仅是RequestInfo实例上的一些操作(void func)。所以我不打算执行{print(“hello action”)}return Completable.onComplete(),而是返回f(RequestInfo)的结果,其中f返回Completable。我不明白。那么您还有另一个函数可以返回一个
可完成的
?是的,还有另一个函数Completable
generateAndSaveGameToDB(RequestInfo)
,它实际生成并将游戏保存到数据库中,然后返回
可完成的
(可能会失败),因此我们应该能够返回
可完成的.onError()
来自
NBAService::generateGame()
。希望它有意义。因此,如果我可以这样写,那将是我真正想要的:
CompletableSubject结果=CompletableSubject.create();submit(()->{result=generateAndSaveGameToDB(info)});返回结果
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());
    }
}