RxJava中工作线程的thread priority问题
发现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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我在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.setInitIoSchedulerHandler
2、
RxJavaPlugins.setIoSchedulerHandler
从名字上可以看出两者的区别,
RxJavaPlugins.setInitIoSchedulerHandler
用于创建Scedulers.io()
所对应的默认值,所以调用晚了就没有效果了,而RxJavaPlugins.setIoSchedulerHandler
则是当你调用Scedulers.io()
时会将默认值回调给你,由你在 默认值 与 你自己的Scheduler
之间作出选择,所以自注册时起就是有效果的。最后总结一下:
1、由
ThreadFactory
创建符合要求的线程。2、根据
ThreadFactory
创建自定义的Scheduler
3、通过
RxJavaPlugins
的方法关联 自定义的Scheduler
到Scedulers.io()
方法上。