我有以下代码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);
输出保持不变
答案 0 :(得分:2)
读取here,THREAD_PRIORITY_BACKGROUND
会给该线程上的任务分配比正常低的优先级。
使用Thread.setPriority()
从here获取信息,其值从MIN_PRIORITY(1)到MAX_PRIORITY(10)而 Process.setThreadPriority()
支持的值从-20到19。
下图显示了Android Scheduler和Linux Scheduler及其优先级。调用Process
和Thread
获取线程优先级将返回两个不同的值,因为它们是两个不同的调度程序,就像在日志中一样。
更新:
This帖子对此提供了一些见解:
“ Thread.getId()只是一个静态的“ java层”,每个线程都可以自动递增。”
ThreadID不等于ProcessID。
但是,将long转换为int并将ThreadID提供给Process会返回预期的值Process.getThreadPriority((int) Thread.currentThread().getId())
。