Какая разница между Thread.setPriority() и android.os.Process.setThreadPriority()
Если у меня есть код вроде:
Runnable r = ...;
Thread thread = new Thread(r);
thread.setPriority((Thread.MAX_PRIORITY + Thread.NORM_PRIORITY) / 2);
или...
Runnable r = ...
Thread thread = new Thread( new Runnable() {
public void run() {
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_MORE_FAVORABLE);
r.run();
}
});
IS. Требуется/предпочитается способ android.os.Process?
ПОЧЕМУ является способом android.os.Process предпочтительным/обязательным, если он есть?
Это не ясно документировано, насколько я могу судить.
Ответы
Ответ 1
Текущая реализация Dalvik, кажется, отображает потоки Java один за другим в базовые PTHREAD системы Linux, как вы сказали. Все потоки всех приложений принадлежат одной и той же группе потоков в системе, поэтому каждый поток конкурирует со всеми потоками всех приложений.
Поэтому в настоящее время Thread.setPriority
должен делать то же самое, что и Process.setThreadPriority
, используя меньшую шкалу приоритетов Java. Отображение приоритетов определяется в kNiceValues
в vm/Thread.c
Ответ 2
Google использует
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
в разделе Volley Network Dispatcher, поэтому я считаю, что использование метода Process.setThreadPriority() - это путь.
Ответ 3
Я полагался бы на thread.setPriority()
. android.os.Process.setThreadPriority
обозначает реальный приоритет потока для ОС Linux с базовым уровнем. Тем не менее, они могут, но не должны отображаться в потоках Dalvik/Java VM, поскольку виртуальная машина может выполнять потоки по собственному усмотрению или использовать системные потоки или их комбинацию. Повышение приоритета системы, скорее всего, приведет к приоритизации вашего приложения в пользу других, если не ограничено ограничениями безопасности для Android, но не гарантирует приоритет вашего текущего Java-потока в пользу других потоков Java в вашем приложении.