- Android线程的优先级和设置方法。Android线程大方向上来说,可以分为UI线程和background线程,如果从UI线程启动,则该线程优先级默认为Default,归于defaultgroup,会平等的和UI线程争夺CPU资源。这一点尤其需要注意,在对UI性能要求高的场景下建议将线程设置为background线程:
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
Android开发者需要显式的将工作线程归于backgroundgroup。
2.Android线程的优先级和设置方法
(1)android.os.Process.setThreadPriority (int priority) android.os.Process.setThreadPriority (int tid, int priority) priority:【-20, 19】,高优先级 -> 低优先级. (2)java.lang.Thread.setPriority (int priority) priority:【1, 10】,低优先级 -> 高优先级. 测试后发现,使用android自己的API(第1种方法)设置的优先级,对线程调度影响显著.
-
在Rxjava上面去改变线程的优先级 我在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 的方法关联 自定义的Scheduler 到Scedulers.io()方法上。
-
通过HandlerThread设置当前线程的优先级
-
private void initHandlerThread() {
HandlerThread thread = new HandlerThread("abc", Process.THREAD_PRIORITY_BACKGROUND); thread.start();}