发现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一样,于是,我来求救了。
此线程和彼线程不是一个概念
以下代码摘自:io.reactivex.internal.schedulers.IoScheduler.java
int priority = Math.max(1, Math.min(10, Integer.getInteger("rx2.io-priority", 5).intValue()));
WORKER_THREAD_FACTORY = new RxThreadFactory("RxCachedThreadScheduler", priority);
EVICTOR_THREAD_FACTORY = new RxThreadFactory("RxCachedWorkerPoolEvictor", priority);
印证了以上关于rx2.io-priority的说法
默认优先级是5,如果设置了参数rx2.io-priority,则以设置的为准
Pure Java的Thread Priority,应该是调用 Thread.currentThread().getPriority() 来获得
在Android 里,查看Process类的文档,有这么一句话
getThreadPriority(int tid)
Return the current priority of a thread, based on Linux priorities.
Java Thread 和 Linux Thread 看起来不是一回事
如果一定要使用Linux Thread的优先级
可以考虑自定义一个ThreadFactory,在里面调用Process.setThreadPriority。使用此ThreadFactory创建Executor,然后使用Schedulers.from(executor)来生成你自定义的一个Scheduler