adroid线程池的运用

来源:互联网 发布:ecmall微信商城源码 编辑:程序博客网 时间:2024/05/22 05:32
package com.cenzr.manager;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;/** * 管理线程池 */public class ThreadManager {private ThreadManager() {}private static ThreadManager instance = new ThreadManager();private ThreadPoolProxy longPool;private ThreadPoolProxy shortPool;public static ThreadManager getInstance() {return instance;}// 联网比较耗时// cpu的核数*2+1public synchronized ThreadPoolProxy createLongPool() {if (longPool == null) {longPool = new ThreadPoolProxy(5, 5, 5000L);}return longPool;}// 操作本地文件public synchronized ThreadPoolProxy createShortPool() {if(shortPool==null){shortPool = new ThreadPoolProxy(3, 3, 5000L);}return shortPool;}public class ThreadPoolProxy {private ThreadPoolExecutor pool;private int corePoolSize;private int maximumPoolSize;private long time;public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long time) {this.corePoolSize = corePoolSize;this.maximumPoolSize = maximumPoolSize;this.time = time;}/** * 执行任务 * @param runnable */public void execute(Runnable runnable) {if (pool == null) {// 创建线程池/* * 1. 线程池里面管理多少个线程2. 如果排队满了, 额外的开的线程数3. 如果线程池没有要执行的任务 存活多久4. * 时间的单位 5 如果 线程池里管理的线程都已经用了,剩下的任务 临时存到LinkedBlockingQueue对象中 排队 */pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize,time, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>(10));}pool.execute(runnable); // 调用线程池 执行异步任务}/** * 取消任务 * @param runnable */public void cancel(Runnable runnable) {if (pool != null && !pool.isShutdown() && !pool.isTerminated()) {pool.remove(runnable); // 取消异步任务}}}}

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

import java.util.concurrent.BlockingQueue;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.RejectedExecutionHandler;import java.util.concurrent.ThreadFactory;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;/** * 创建线程池,执行任务,提交任务 */public class ThreadPoolProxy {ThreadPoolExecutormExecutor;// 只需创建一次intmCorePoolSize;intmMaximumPoolSize;longmKeepAliveTime;public ThreadPoolProxy(int corePoolSize, int maximumPoolSize, long keepAliveTime) {super();mCorePoolSize = corePoolSize;mMaximumPoolSize = maximumPoolSize;mKeepAliveTime = keepAliveTime;}private ThreadPoolExecutor initThreadPoolExecutor() {//双重检查加锁if (mExecutor == null) {synchronized (ThreadPoolProxy.class) {if (mExecutor == null) {TimeUnit unit = TimeUnit.MILLISECONDS;BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<Runnable>();// 无界队列ThreadFactory threadFactory = Executors.defaultThreadFactory();RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();// 丢弃任务并抛出RejectedExecutionException异常。mExecutor = new ThreadPoolExecutor(//mCorePoolSize,// 核心的线程数mMaximumPoolSize,// 最大的线程数mKeepAliveTime, // 保持时间unit, // 保持时间对应的单位workQueue,// 缓存队列/阻塞队列threadFactory, // 线程工厂handler// 异常捕获器);}}}return mExecutor;}/**执行任务*/public void execute(Runnable task) {initThreadPoolExecutor();mExecutor.execute(task);}/**提交任务*/public Future<?> submit(Runnable task) {initThreadPoolExecutor();return mExecutor.submit(task);}/**移除任务*/public void removeTask(Runnable task) {initThreadPoolExecutor();mExecutor.remove(task);}}


0 0
原创粉丝点击