在java内置API中操作线程所用到的类为Thread。创建线程一般有两种方式,
继承Thread方式
实现Runnable方式,并以runnable作为target创建Thread
在Android中的耗时任务一般都需要另开线程来执行,常常需要用线程池来管理这些线程,实现控制线程数,重用,控制执行和取消等功能。
Java提供了四种线程池
可缓存线程池,若线程池长度超过处理需要,则回收空线程,否则创建新线程,线程规模可无限大。
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。
定长线程池,支持定时及周期性任务执行,类似Timer。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
使用实例:
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
//表示延迟1秒后每3秒执行一次。
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("delay 1 seconds, and excute every 3 seconds");
}
}, 1, 3, TimeUnit.SECONDS);
单线程 的线程池,支持FIFO, LIFO, 优先级策略。
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
通过观察源码,其中四种线程的创建都是创建一个ThreadPoolExecutor。其中ThreadPoolExecutor是ExecutorService接口的实现类。
此包是java的并发编程包,其下定义了三个Executor接口
Executor:一个运行新任务的简单接口。
ExecutorService:扩展了Executor接口。添加了一些用来管理执行器生命周期和任务生命周期的方法。
ScheduledExecutorService:扩展了ExecutorService。支持Future和定期执行任务。
实现类包括:ScheduledThreadPoolExecutor、ThreadPoolExecutor。
java中提供的四种线程池,除了ScheduledThreadPool使用的是ScheduledThreadPoolExecutor,其他均为ThreadPoolExecutor。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {}
参数说明
corePoolSize :线程池的核心线程数。
maximumPoolSize :线程池所能容纳的最大线程数。
keepAliveTime :非核心线程闲置时的超时时长。超过该时长,非核心线程就会被回收。
unit :keepAliveTime的时间单位。
workQueue :线程池中的任务队列。
threadFactory:线程工厂,默认值DefaultThreadFactory。
handler : 饱和策略,当线程池中的数量大于maximumPoolSize,对拒绝任务的处理策略,默认值ThreadPoolExecutor.AbortPolicy()。
参考:
Java并发教程(Oracle官方资料)
Trinea:Java(Android)线程池
Java多线程:ThreadPoolExecutor详解
并发编程网 - ifeve.com
线程池ThreadPoolExecutor介绍