RXJava - 线程优先级

时间:2016-02-22 12:29:07

标签: android multithreading threadpool rx-java

我正在使用以下内容为我的订阅获取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?

1 个答案:

答案 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);