如果你要反复执行一个任务,用不同的数据集(参数不同),但一次只要一个执行(任务是单线程的),IntentService符合你的需求。当需要在资源可用时自动执行任务,或允许多任务同时执行,你需要一个线程管理器管理你的线程。ThreadPoolExecutor,会维护一个队列,当它的线程池有空时,从队列里取任务,并执行。要运行任务,你要做的就是把它加到队列里。
线程池可以并联运行一个任务的多个实例,所以你要保存代码线程安全。能被多线程访问的变量需要同步块.更多信息,见Processes and Threads(http://www.easck.com/guide/components/processes-and-threads.html)
定义线程池类
在它自己类中实例ThreadPoolExecutor.在类里,如下操作:
为线程池使用static变量
你可能在app里只需要一个单例的线程池,这是为了统一控制限制CPU或网络资源。如果你有不同的Runnable类型,你可能想要每种类型都有各自的线程池,但这些都可以放到一个单一的实例里。比如,你可以把它声明成全局变量:
public class PhotoManager {
...
static {
...
// Creates a single static instance of PhotoManager
sInstance = new PhotoManager();
}
...
使用private构造方法
把构造方法声明成private,可以确保单例,这意味着你不需要在同步代码块里封装类访问。
复制代码public class PhotoManager {
...
/**
* 构建用来下载和decode图片的工作队列和线程池,因为构造方法标记为private,
* 对其他类不可访问(甚至同包下的类)
*/
private PhotoManager() {
...
}










