Android 多线程下载文件原理霸气解析介绍 -----线程池管理和任务队列 (2)

多线程下载、上传文件肯定是依靠线程池管理的,这篇文章插曲介绍一下线程池。

    /**
     * 创建线程池
     * 参数1:核心线程数量
     * 参数2:线程池最大数量
     * 参数3:线程存活时间
     * 参数4:设置时间类型
     * 参数5:给每个线程取名称,参数5 可以不写
     * 原理:
     */
    private static final ThreadPoolExecutor sThreadPool = new ThreadPoolExecutor(MAX_THREAD, MAX_THREAD, 60,
            TimeUnit.MICROSECONDS, new LinkedBlockingDeque(), new ThreadFactory() {

        private AtomicInteger mInteger = new AtomicInteger(1);
        @Override
        public Thread newThread(Runnable runnable) {
            // 指定Runnable  和线程名称
            Thread mThread = new Thread(runnable, "download thread #" + mInteger.getAndIncrement());
            return mThread;
        }
    });

Android 多线程下载文件原理霸气解析介绍 -----线程池管理和任务队列 (2)_第1张图片

线程池实现原理:
线程池首先会创建核心线程, 如果在执行时,超过最大数量会抛出异常

为什么要有队列:
因为cpu的资源是有限的,如果多个线程一起执行,为很消耗cpu资源,为了避免这一现象,就用队列去管理。

队列有几种:
1、有限队列(开启线程的数量为有限的):
SynchronousQueue : 此队列很特殊,可以满足生产者消费者模式,就是此队列最大线程数量只有一个,只能是一个线程消费完了,在生产一个,所以是一个一个的,如果启动多个会抛出异常。

ArrayBockingQueue : 数组队列,可以指定核心线程数量、最大线程数量、很普遍

2、无限队列:
LinkedBloackingQueue : 线程的最大数量是无限制的,所有开启的线程都是核心线程,所以不推荐使用这个。因为也会执行多个线程同时。给cpu造成压力

如何终止线程:

static class MyRunnbale implements Runnable{

        /** volatile 赋值以后可以更快的接收*/
        public volatile boolean flag = true;

        @Override
        public void run() {
            // 再此判断一个线程有没有被打断,如果打断了会走catch 抛异常,
            // 但是 这只是一个状态,等线程下次执行的时候状态会恢复过来,接着正常执行,所以一定在异常里面return,才能停止线程
            while(flag && !Thread.interrupted()) {
                try {
                    System.out.print("执行 ");

                }catch (InternalError e){
                    // 线程被打断了 抛出异常,走这里,一定要return,否则线程不会停止。
                    return;
                }
            }
        }
    }

    public static void main(String[] args) {
        MyRunnbale myRunnbale = new MyRunnbale();
        Thread thread = new Thread(myRunnbale);
        thread.start();

        myRunnbale.flag = false;
        // 打断线程状态
        thread.interrupt();
    }

OK,线程池介绍完毕,下一篇就是言归正传了,写多线程下载了。

你可能感兴趣的:(技术分析)