为什么此代码为线程的优先级提供此输出?

时间:2019-08-13 21:45:02

标签: java android multithreading linux-kernel android-threading

我有以下代码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);
输出保持不变

1 个答案:

答案 0 :(得分:2)

读取hereTHREAD_PRIORITY_BACKGROUND会给该线程上的任务分配比正常低的优先级。

使用Thread.setPriority()here获取信息,其值从MIN_PRIORITY(1)到MAX_PRIORITY(10) Process.setThreadPriority()支持的值从-20到19。

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

enter image description here

更新:

This帖子对此提供了一些见解:

  • Process.myTid()是Linux线程ID
  • Thread.getId()很简单 连续长号。

“ Thread.getId()只是一个静态的“ java层”,每个线程都可以自动递增。”

ThreadID不等于ProcessID。

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

相关问题