Android

Android线程管理 - ExecutorService线程池

2018-05-14  本文已影响0人  世道无情

1. 为什么要引入线程池?


所以就引入线程池;

2. 线程池好处?


3. ExecutorService介绍?


4. Executors工厂类


Executors工厂类提供四种线程池:newSingleThreadExecutor、newScheduledThreadPool、newCacheThreadPool、newFixedThreadPool;

1>:newSingleThreadExecutor用法

代码如下:

    /**
     * 单线程的线程池:
     *          只会用一个线程来执行任务,保证所有任务按照指定顺序执行
     */
    private void newSingleThreadExecutor() {
        ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
        for (int i = 1; i <= number; i++) {
            final int index = i;
            singleThreadPool.execute(new Runnable() {
                @SuppressLint("LongLogTag")
                @Override
                public void run() {
                    String threadName = Thread.currentThread().getName();
                    Log.e("TAG", "线程:"+threadName+",正在执行第" + index + "个任务");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

2>:newScheduledThreadPool用法

代码如下:

    /**
     *  每次创建一个定长的线程:
     *              可执行定时的、周期性的任务
     */
    private void newScheduledThreadPool() {
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
        //延迟2秒后执行该任务
        scheduledThreadPool.schedule(new Runnable() {
            @SuppressLint("LongLogTag")
            @Override
            public void run() {
                String threadName = Thread.currentThread().getName();
                Log.e("TAG", "线程:" + threadName + ",正在执行");
            }
        }, 2, TimeUnit.SECONDS);
        //延迟1秒后,每隔2秒执行一次该任务
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                String threadName = Thread.currentThread().getName();
                Log.e("TAG", "线程:" + threadName + ",正在执行");
            }
        }, 1, 2, TimeUnit.SECONDS);
    }

3>:newCacheThreadPool:

创建一个可缓存的线程池,如果线程池长度超过处理需要,可以回收空闲的线程;

代码如下:

    /**
     * 可缓存的线程池:
     *          如果线程池超过处理需要,可回收空闲线程
     */
    private void newCachedThreadPool() {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 1; i <= number; i++) {
            final int index = i;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            cachedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    String threadName = Thread.currentThread().getName();
                    Log.e("TAG", "线程:" + threadName + ",正在执行第" + index + "个任务");
                    try {
                        long time = index * 500;
                        Thread.sleep(time);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

4>:newFixedThreadPool用法

代码如下:

    /**
     * 可重用的、固定的线程数的线程池
     *              固定的线程数是5
     */
    private void newFixedThreadPool() {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
        for (int i = 1; i <= number; i++) {
            final int index = i;
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    String threadName = Thread.currentThread().getName();
                    Log.e("TAG", "线程:"+threadName+",正在执行第" + index + "个任务");
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读