2
public class MainActivity extends Activity {

private int newThreadCount;
private int uiCount;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Thread t = new Thread() {
        @Override
        public void run() {
            //Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
            while (true) {
                newThreadCount++;
            }
        }
    };
    t.start();
    while (uiCount < 100000000) {
        uiCount++;
    }
    Log.d("TEST", "uiCount=" + uiCount + " newThreadCount=" + newThreadCount);
}

我知道 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)

让线程 t 在bg_non_interactive cgroups中运行

  1. 运行上面的代码,Log print uiCount=100000000 and newThreadCount=50000000(around)
  2. 去掉 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND) 然后再次运行代码,Log打印几乎一样。

那么Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)的作用是什么?

4

1 回答 1

2

Android API 已经为您分配了工作线程一个后台优先级(例如,参见 HandlerThread 和 AsyncTask 的源代码)。

然而,重要的是要记住,情况并非总是如此。例如,在主 UI 线程上实例化的线程和 ExecutorServices 将继承默认的前台优先级,从而更容易出现延迟并可能损害应用程序的性能。在这些情况下,您应该始终记住在运行线程之前通过调用 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND) 来设置线程的优先级。这样做很简单,如下例所示:

new Thread(new Runnable() {
  @Override
  public void run() {
    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

    // ...
  }
}).start();
于 2016-09-08T10:02:04.740 回答