2

我有以下代码onCreate()

Log.d(TAG, "Setting priority background");  
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);  
Log.d(TAG, Thread.currentThread().getId() + ": " + Thread.currentThread().getPriority());
Log.d(TAG, Process.getThreadPriority(Process.myTid()) + " - myTid() " + Process.myTid() + " Thread.getId() = " + Thread.currentThread().getId());
// start a thread here
Thread thread = new Thread(() -> {
            Log.d(TAG, " In new thread");
            Log.d(TAG, Thread.currentThread().getId() + ": " +   Thread.currentThread().getPriority());
            Log.d(TAG, Process.getThreadPriority(Process.myTid()) + " - myTid() " + Process.myTid() + "Thread.getId() = " + Thread.currentThread().getId());

}  

输出是:

Setting priority background  
1: 5  
10 - myTid() 8798 Thread.getId() = 1  

In new thread  
7534: 10  
-8 - myTid() 8819 Thread.getId() = 7534 

有人可以解释一下:
1)即使我setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);在下一行设置了日志显示优先级5。为什么?
2)-8第二个线程的优先级输出来自哪里?
3)10新线程的来源也来自哪里?

更新:
如果我删除该行Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
输出保持不变

4

1 回答 1

2

阅读此处THREAD_PRIORITY_BACKGROUND将低于正常优先级的优先级委托给该线程上的任务。

这里获取信息,usingThread.setPriority()包含从 MIN_PRIORITY(1) 到 MAX_PRIORITY(10) 的值, Process.setThreadPriority()支持从 -20 到 19 的值。

下图显示了 Android 调度程序和 Linux 调度程序及其优先级。调用ProcessThread获取线程优先级将返回两个不同的值,因为它们是两个不同的调度程序,就像在您的日志中一样。

在此处输入图像描述

更新:

这篇文章对此提供了一些见解:

  • Process.myTid() 是 linux 线程 ID
  • Thread.getId() 是一个简单的连续长数字。

“Thread.getId() 只是一个“java 层”静态长期为每个线程自动递增。”

ThreadID 不等于 ProcessID。

但是,将 long 转换为 int 并将 ThreadID 提供给 Process 会返回一个预期值Process.getThreadPriority((int) Thread.currentThread().getId())

于 2019-08-13T22:15:50.307 回答