您的位置:首页 > 其它

浅谈安卓线程池相关问题

2016-03-14 23:09 211 查看
作为一个标准的程序员,我们都非常清楚。线程的创建和销毁时一个耗时的操作,如果在程序中反复创建和销毁,那么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时会超时退出,默认情况下不会退出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: