Почему этот код выдает этот вывод для приоритета потока?

У меня есть следующий код 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);
, вывод останется прежним


person Jim    schedule 13.08.2019    source источник


Ответы (1)


Читая здесь, THREAD_PRIORITY_BACKGROUND делегирует приоритет ниже обычного задание в этой теме.

Взяв информацию из здесь, используя Thread.setPriority() содержит значение из MIN_PRIORITY(1 ) на MAX_PRIORITY(10) тогда как Process.setThreadPriority() поддерживает значение от -20 до 19.

На изображении ниже показаны Планировщик Android и Планировщик Linux и их уровни приоритета. Вызов Process и Thread для получения приоритета потока вернет два разных значения, поскольку это два разных планировщика, как в ваших журналах.

введите здесь описание изображения

Обновлять:

Этот пост дал некоторое представление об этом:

  • Process.myTid() — это идентификатор потока Linux.
  • Thread.getId() — это простое последовательное длинное число.

"Thread.getId() — это просто статический "уровень Java", который автоматически увеличивается для каждого потока."

ThreadID не равен ProcessID.

Однако преобразование long в int и предоставление ThreadID процессу возвращает ожидаемое значение Process.getThreadPriority((int) Thread.currentThread().getId()).

person JakeB    schedule 13.08.2019
comment
Это сопоставление не объясняет, откуда взялось значение -8, хотя я считаю, - person Jim; 14.08.2019
comment
Также согласно этому отображению 5 <=> 0, но печатается 10 - person Jim; 14.08.2019
comment
Обновлено с дополнительной информацией. - person JakeB; 14.08.2019
comment
Спасибо за обновление, но я не использую Process.getThreadPriority((int) Thread.currentThread().getId()). Как это называется? - person Jim; 14.08.2019
comment
Я имею в виду, что я нигде не делаю Process.getThreadPriority((int) Thread.currentThread().getId()). Почему это на что-то влияет? - person Jim; 14.08.2019
comment
However, casting the long to int and providing the ThreadID to the Process где это происходит? - person Jim; 14.08.2019
comment
Нет, я говорил, что это то, что я сделал. Я больше не знаю, не ища больше в этом. Похоже, что Process.myTid в какой-то момент переключает потоки? Похоже, что это пул потоков, а не один поток. - person JakeB; 14.08.2019
comment
Хорошо, я только что заметил, что в классе Thread приоритет обновляется только в том случае, если кто-то вызывает метод setPriority!!! Таким образом, класс Thread не видит изменения приоритета, происходящего из Process.setThreadPriority!!!! Они не синхронизируются! Таким образом, это объясняет, почему приоритеты, возвращаемые двумя API, различаются. - person Jim; 14.08.2019