作为一个标准的程序员,我们都非常清楚。线程的创建和销毁时一个耗时的操作,如果在程序中反复创建和销毁,那么APP的流畅度会很受影响,甚至会奔溃。为了增加程序健壮性且能是实现复杂业务逻辑,这时候我们引入线程池的概念。
线程池的优点在于减少了创建线程的消耗,每一次使用线程直接从线程池中拿来用即可,缺点就是线程池会一直占用内存,如果当我们只是用一个线程时,多余的创建出来的会造成资源浪费,也就是惊群现象。
A:线程的实现方法
POOL_SIZE = 4;// 线程池的大小最好设置成为CUP核数的2N
MAX_POOL_SIZE = 6;// 设置线程池的最大线程数
KEEP_ALIVE_TIME = 4;// 设置线程的存活时间
// 创建线程池工厂 ThreadFactory factory = new PriorityThreadFactory("threadpool", android.os.Process.THREAD_PRIORITY_BACKGROUND);
// 创建工作队列
BlockingQueue<Runnable> workQueue = new LinkedBlockingDeque<Runnable>(); mExecutor = nThreadPoolExecutor(POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, workQueue, factory); }
// 在线程池中执行线程 id
submit(Runnable command){
Executor.execute(command)};
//在线程池的停止和关闭
ThreadPoolExecutor提供了两个方法,用于线程池的关闭,分别是shutdown()和shutdownNow(),其中:
shutdown():不会立即终止线程池,而是要等所有任务缓存队列中的任务都执行完后才终止,但再也不会接受新的任务
shutdownNow():立即终止线程池,并尝试打断正在执行的任务,并且清空任务缓存队列,返回尚未执行的任务
B:execute()执行
addIfUnderCorePoolSize():在线程池大小小于核心线程池大小的情况下,扩展线程池
addIfUnderMaximumPoolSize():在线程池大小小于线程池大小上限的情况下,扩展线程池
ensureQueuedTaskHandled():保证在线程池关闭的情况下,新加入队列的线程也能正确处理
C:核心线程问题
核心线程会一直存活,即使没有任务需要处理。当线程数小于核心线程数时,即使现有的线程空闲,线程池也会优先创建新线程来处理任务,而不是直接交给现有的线程处理。核心线程在allowCoreThreadTimeout被设置为true时会超时退出,默认情况下不会退出