Android 设置线程的优先级

2,592 阅读2分钟
  1. 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种方法)设置的优先级,对线程调度影响显著.

  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()方法上。

  1. 通过HandlerThread设置当前线程的优先级

  2. private void initHandlerThread() {

     HandlerThread thread = new HandlerThread("abc", Process.THREAD_PRIORITY_BACKGROUND);
     thread.start();
    

    }