Android中线程池的原理和应用

线程池原理
  • 要了解线程池原理,不如自己动手写个线程池吧
public class ThreadPool {
            int maxCount = 3;//限制线程最大数目
            AtomicInteger count =new AtomicInteger(0);// 当前开的线程数  count=0,为了线程同步
            LinkedList<Runnable> runnables = new LinkedList<Runnable>();//Runnable泛型集合存放Runnable对象
        /**
        *1.将要执行任务添加到list缓存
        *2、当前开的线程数(原子变量)++
        *3、判断当前开的线程数小于等于最大数目,则创建新线程
        *count.incrementAndGet():increment是++;Get拿到当前count值
        */
            public void execute(Runnable runnable) {
                runnables.add(runnable);//任务添加到list缓存
                if(count.incrementAndGet()<=3){
                    createThread();
                }
            }
        /**
        *要开启的线程内情况:
        *1、判断Runnable集合大小,不为空,取出来那个异步任务
        *2、任务不为空,就放在线程内执行
        *3、任务集合为空,即任务都执行完了,此时线程等待
        */
            private void createThread() {
                new Thread() {
                    @Override
                    public void run() {
                        super.run();
                        while (true) {
                            // 取出来一个异步任务
                            if (runnables.size() > 0) {
                                Runnable remove = runnables.remove(0);
                                if (remove != null) {
                                    remove.run();
                                }
                            }else{
                                //  等待状态   wake();
                            }
                        }
                    }
                }.start();
            }
        }
线程池应用
- 写个工具类ThreadManager
/**
 * 管理线程池
 *
 * @author stephen
 *
 */
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+1
    public 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); // 取消异步任务
            }
        }
    }
}
- 在其他类中应用线程池执行异步任务
ThreadManager.getInstance().createLongPool().execute(new Runnable() {

            @Override
            public void run() {
            //要处理的任务细节
            }
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值