我正在使用以下内容为我的订阅获取ExecutorService
:
public static ExecutorService getThreadPoolExecutorService(int threads)
{
int NUMBER_OF_CORES = Runtime.getRuntime().availableProcessors();
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
NUMBER_OF_CORES * 2,
NUMBER_OF_CORES * 2,
60L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>()
);
return Executors.newFixedThreadPool(threads, threadPoolExecutor.getThreadFactory());
}
并使用如下:
public static Scheduler getBackgroundSchedular()
{
if (mBackgroundExecutorService == null)
mBackgroundExecutorService = ThreadUtil.getThreadPoolExecutorService(4);
return Schedulers.from(mBackgroundExecutorService);
}
我将这个调度表用于我的observables,它应该在后台运行。
问题
如何为RXJava使用PriorityBlockingQueue
?通常我会使用一些实现比较函数的特殊runnable并使用PriorityBlockingQueue
的相应比较函数,并将上面示例中的LinkedBlockingQueue
替换为PriorityBlockingQueue
,但我该怎么做这与RXJava observables?
答案 0 :(得分:2)
RxJava中的调度程序与数据流正交,根本不了解它们。他们所做的就是执行一个Runnable实例,由运算符创建的所有Runnables都是相同的。因此,将优先级队列与调度程序一起使用是没有意义的。
此外,数据流是顺序的,除非有一些像线程交换这样的边界,否则它们会保持排序。除非您收集事件并手动进行排序,否则具有优先级队列的操作员很可能会按预期重新排序数据。
修改强>
有点不同寻常,但你也可以在一个主题和一些运算符上放置PriorityBlockingQueue,这样你就可以用一个任务来提供一个序列:
PriorityBlockingQueue<Task> q = ...
Subject<Integer, Integer> subject = PublishSubject.<Integer>create().toSerialized();
subject
.map(v -> q.poll())
.doOnNext(v -> v.execute())
.subscribe();
q.offer(new Task(...));
subject.onNext(1);