new Thread(task).start() VS ThreadPoolExecutor.submit(task) in Android
在我的Android项目中,我有很多地方需要异步运行一些代码(Web请求,对db的调用等)。这不是长时间运行的任务(最多几秒钟)。直到现在,我还在做这种事情,创建一个新线程,通过任务传递一个新的可运行项。但最近我读了一篇关于Java中的线程和并发性的文章,并了解到为每个任务创建一个新的线程不是一个好的决定。
所以现在我已经在我的班级中创建了一个包含5个线程的线程。代码如下:ThreadPoolExecutor
Application
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();
}
}
因此,当我想在代码中运行异步任务时,我会获取实例并调用将runnable传递给它的方法。如您所见,我还检查了线程池是否有空闲线程来执行我的任务,如果没有,我将创建一个新的线程(我不认为这会发生,但无论如何......我不希望我的任务在队列中等待并减慢应用程序的速度)。App
submitRunnableTask
在应用程序的回调方法中,我关闭了池。onTerminate
所以我的问题是:这种模式比在代码中创建新的线程更好吗?我的新方法有哪些优点和缺点?它是否会导致我还没有意识到的问题?你能给我一些比这更好的建议来管理我的异步任务吗?
附言:我在Android和Java方面有一些经验,但我远不是一个并发大师)所以在这类问题上可能有一些我不太理解的方面。任何建议将不胜感激。