В моем проекте Android у меня было много мест, где мне нужно было запустить некоторый код асинхронно (веб-запрос, вызов db и т.д.). Это не долго выполняемые задачи (максимум несколько секунд). До сих пор я делал такие вещи с созданием нового потока, передавая ему новую runnable с задачей. Но недавно я прочитал статью о потоках и concurrency в Java и понял, что создание нового потока для каждой отдельной задачи не является хорошим решением.
Итак, теперь я создал ThreadPoolExecutor
в моем классе Application
, который содержит 5 потоков.
Вот код:
public class App extends Application {
private ThreadPoolExecutor mPool;
@Override
public void onCreate() {
super.onCreate();
mPool = (ThreadPoolExecutor)Executors.newFixedThreadPool(5);
}
}
А также у меня есть метод отправки Runnable-задач исполнителю:
public void submitRunnableTask(Runnable task){
if(!mPool.isShutdown() && mPool.getActiveCount() != mPool.getMaximumPoolSize()){
mPool.submit(task);
} else {
new Thread(task).start();
}
}
Поэтому, когда я хочу запустить асинхронную задачу в своем коде, я получаю экземпляр App
и вызываю метод submitRunnableTask
, передавая ему runnable. Как вы можете видеть, я также проверяю, имеет ли пул потоков бесплатные потоки для выполнения моей задачи, если нет, я создаю новый поток (я не думаю, что это произойдет, но в любом случае... я не знаю, t хочу, чтобы моя задача ждать в очереди и замедлять приложение).
В методе обратного вызова onTerminate
приложения я я завершаю пул.
Итак, мой вопрос следующий: Является ли этот тип шаблонов лучше, чем создание новых потоков в коде? Какие плюсы и минусы имеет мой новый подход? Может ли это вызвать проблемы, которые я еще не знаю? Можете ли вы посоветовать мне что-то лучше этого для управления моими асинхронными задачами?
P.S. У меня есть некоторый опыт работы на Android и Java, но я далек от того, чтобы быть гуру concurrency). Возможно, есть аспекты, которые я плохо понимаю в таких вопросах. Любые советы будут оценены.