RxJava中工作线程的thread priority问题

发布于 2022-09-04 10:37:49 字数 941 浏览 19 评论 0

发现RxJava中Scedulers.io() / Schedulers.newthread()等线程的thread priority是跟mainThread一样的,如何将其设置为Process.THREAD_PRIORITY_BACKGROUND

在网上找了好久,发现jake大神提到过这个问题,并且为此向RxJava项目提交过一些代码,但是那是针对1.x的。

在2.x上,有一个issue提到过这个问题,项目的一位开发人员回复说2.x中是可以更改每个Scheduler的线程优先级的。经过一番查找,在Schedulers中找到了设置的方法,那就是通过System.setProperty(String key, String value),其中"rx2.io-priority"是修改io线程优先级的key,但由于Process.THREAD_PRIORITY_BACKGROUND是android系统里的值,在java里,线程优先级取值范围是1-10,抱着试试看的态度,我设置了一下,发现果然不起作用:将Process.THREAD_PRIORITY_BACKGROUND设置上之后,通过Process.getThreadPriority(Process.myTid())拿到的值依然是0,即跟mainThread一样,于是,我来求救了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

嘿咻 2022-09-11 10:37:49

我在Java和Android中用Thread.currentThread().getPriority()取到的值是正常的,但如果你想通过Process改变其优先级的话,很明显 "rx2.io-priority"并不能满足你要需求,还是需要借助ThreadFactory来解决这个问题。

ThreadFactory factory = new ThreadFactory() {
    @Override
    public Thread newThread(@NonNull final Runnable r) {
        
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                //这里的r是线程池或Sceduler的Worker,所以我们要在调用r.run()方法前提前设置优先级
                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                r.run();
            }
        });
        thread.setPriority(5);
        return thread;
    }
};

接下来就是怎么将我们自定义的 ThreadFactory 变成 Sceduler,有两种方法:
1、Schedulers.from(Executor)
2、RxJavaPlugins.createIoScheduler(ThreadFactory)

之后就是将 Scedulers.io()中对应的Sceduler与我们自己创建的Sceduler关联起来,当然你也可以不用关联,直接使用自定义的Sceduler看你的需求。
RxJava 提供了两个静态方法:
1、RxJavaPlugins.setInitIoSchedulerHandler
2、RxJavaPlugins.setIoSchedulerHandler

从名字上可以看出两者的区别,RxJavaPlugins.setInitIoSchedulerHandler 用于创建Scedulers.io() 所对应的默认值,所以调用晚了就没有效果了,而RxJavaPlugins.setIoSchedulerHandler 则是当你调用Scedulers.io()时会将默认值回调给你,由你在 默认值 与 你自己的Scheduler 之间作出选择,所以自注册时起就是有效果的。

最后总结一下:
1、由 ThreadFactory 创建符合要求的线程。
2、根据 ThreadFactory 创建自定义的Scheduler
3、通过 RxJavaPlugins 的方法关联 自定义的SchedulerScedulers.io()方法上。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文