发现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一样,于是,我来求救了。
我在Java和Android中用
Thread.currentThread().getPriority()取到的值是正常的,但如果你想通过Process改变其优先级的话,很明显"rx2.io-priority"并不能满足你要需求,还是需要借助ThreadFactory来解决这个问题。接下来就是怎么将我们自定义的
ThreadFactory变成Sceduler,有两种方法:1、
Schedulers.from(Executor)2、
RxJavaPlugins.createIoScheduler(ThreadFactory)之后就是将
Scedulers.io()中对应的Sceduler与我们自己创建的Sceduler关联起来,当然你也可以不用关联,直接使用自定义的Sceduler看你的需求。RxJava 提供了两个静态方法:
1、
RxJavaPlugins.setInitIoSchedulerHandler2、
RxJavaPlugins.setIoSchedulerHandler从名字上可以看出两者的区别,
RxJavaPlugins.setInitIoSchedulerHandler用于创建Scedulers.io()所对应的默认值,所以调用晚了就没有效果了,而RxJavaPlugins.setIoSchedulerHandler则是当你调用Scedulers.io()时会将默认值回调给你,由你在 默认值 与 你自己的Scheduler之间作出选择,所以自注册时起就是有效果的。最后总结一下:
1、由
ThreadFactory创建符合要求的线程。2、根据
ThreadFactory创建自定义的Scheduler3、通过
RxJavaPlugins的方法关联 自定义的Scheduler到Scedulers.io()方法上。