У меня есть класс, который расширяет класс Потока и реализовал его метод выполнения как так.
public void run(){
while(!terminate){
if(paused){
Thread.yield();
}else{
accummulator++;
}
}
}
Этот поток порожден из onCreate метода.
Когда мой UI скрыт (когда клавиша Home будет нажата), мой onPause метод установит приостановленный флаг на истинный и приведет к шагу. Однако в DDMS я все еще вижу, что uTime потока накапливается и его состояние как "выполнение".
Таким образом, мой вопрос. Что надлежащий путь состоит в том, чтобы остановить поток так, чтобы он не израсходовал процессорное время?
На самом деле, держать поток в рабочем состоянии после onPause - плохая практика. Причина в том, что после onPause ваше приложение может выпасть из памяти в любое время без вашего ведома, поэтому вы не сможете выполнить очистку после себя.
Правильный способ сделать это - остановить поток onPause и воссоздать его onResume. Если вам нужно состояние, вы можете использовать встроенные в Android методы или настройки saveState или что-то еще, чтобы сохранить это.
Ваша приостановленная переменная
, скорее всего, кэшируется локально в потоке. Это потому, что он только читается и не изменяется в цикле. Итак, что происходит, так это то, что компилятор / интерпретатор / джиттер оптимизируются, считывая переменную только один раз, а затем выполняя только ветвь else
. Вам нужно пометить это поле как volatile
, чтобы переменная pause
читалась на каждой итерации цикла. Ознакомьтесь с документацией ключевого слова volatile
. Вот некоторая информация о потоках и некоторая информация о синхронизации и параллелизме .
Даже если вы вызываете thread.yield(), вы находитесь внутри цикла while(), который, вероятно, выполняется тысячи раз в секунду, каждый раз вызывая .yield(), но тот факт, что цикл не контролируется, означает, что он использует ресурсы. Если вы поместите туда сообщение Log.d
, вы увидите, что я имею в виду.
Я рекомендую использовать Thread.sleep()
вместо Thread.yield()
. Причина в том, что пока поток спит, он уступает место. Кроме того, сон позволяет замедлить выполнение while()
и не расходовать ресурсы. Интервал сна в 500 мс должен быть достаточным =)