У меня есть несколько экземпляров Activity, которые должны выполнить какое-то действие (в основном, выделить / освободить какой-то тяжелый ресурс) упорядоченным способом. Поэтому я хотел бы иметь переменную области приложения (ExecutorService
с одним потоком для более подробного ограничения потока).
Поскольку область действия Android отсутствует (только Activity / Fragment / Видать) немного сложно найти, в какой момент ExecutorService.shutdown()
должен быть вызван. В настоящее время я mimi c подсчет ссылок (retain()
+ release()
со счетчиком внутри), и это больно и имеет некоторые недостатки (например, retain()
может следовать release()
почти сразу, поэтому я бы предпочел иметь некоторую инерцию («отложенный запуск») и избегайте ненужных воссозданий).
Не вызывается ExecutorService.shutdown()
, считающийся утечкой (я думаю, « да, это утечка », поскольку потоки имеют быть остановленным в какой-то момент)? Что бы вы предложили сделать для достижения моей цели?
Обновление. В моем конкретном случае я использую Executors.newSingleThreadExecutor()
, а на Android (28) он заключен в FinalizableDelegatedExecutorService()
:
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
, и, как я вижу, он просто вызывает shutdown()
на finalize()
:
private static class FinalizableDelegatedExecutorService
extends DelegatedExecutorService {
FinalizableDelegatedExecutorService(ExecutorService executor) {
super(executor);
}
protected void finalize() {
super.shutdown();
}
}
и DelegatedExecutorService
просто перенаправляют все вызовы в упакованный экземпляр (который передается в ctor).
Также ThreadPoolExecutor
также вызывает shutdown()
на своем finalize()
:
/**
* Invokes {@code shutdown} when this executor is no longer
* referenced and it has no threads.
*/
protected void finalize() {
shutdown();
}
Однако finalize()
считается ненадежным , так как не гарантируется для вызова.
Так что безопасно не Звоните ExecutorService.shutdown()
в моем Android приложении?