Android ThreadPool、AsyncTask、Fut

2020-02-17  本文已影响0人  图之

使用多线程用new Thread():
1.多任务情况下,避免线程频繁的创建销毁;
2.多个线程频繁的创建会占用大量的资源,并且在资源竞争的时候出现问题,缺乏统一的管理,容易造成线程卡顿;
3.多个线程频繁销毁,会频繁调用GC机制,降低性能并且耗时;
线程池的作用:
1.对线程统一管理,避免资源竞争造成卡顿、死机等问题;
2.对线程服用,不会在线程结束后立即销毁,等待其他任务。避免了频繁创建、销毁和调用GC机制

public class ThreadPool {
    ThreadPoolExecutor mThreadPoolExecutor;

    private int corePoolSize;
    private int maximumPoolSize;
    private long keepAliveTime;

    private static ThreadPool mThreadPool = null;

    public static ThreadPool getInstance() {
        if (mThreadPool == null) {
            synchronized (ThreadPool.class){
                mThreadPool = new ThreadPool(5, 10, 5 * 1000);
            }
        }
        return mThreadPool;
    }

    private ThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime) {
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.keepAliveTime = keepAliveTime;
    }

    private ThreadPoolExecutor initExecutor() {
        if (mThreadPoolExecutor == null) {
            synchronized (ThreadPool.class) {
                if (mThreadPoolExecutor == null) {

                    TimeUnit unit = TimeUnit.MILLISECONDS;
                    ThreadFactory threadFactory = Executors.defaultThreadFactory();
                    RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
                    LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();

                    mThreadPoolExecutor = new ThreadPoolExecutor(
                            corePoolSize,//核心线程数
                            maximumPoolSize,//最大线程数
                            keepAliveTime,//保持时间
                            unit,//保持时间对应的单位
                            workQueue,
                            threadFactory,//线程工厂
                            handler);//异常捕获器
                }
            }
        }
        return mThreadPoolExecutor;
    }


    /**
     * 执行任务
     */
    public void executeTask(Runnable r) {
        initExecutor();
        mThreadPoolExecutor.execute(r);
    }


    /**
     * 提交任务
     */
    public Future<?> commitTask(Runnable r) {
        initExecutor();
        return mThreadPoolExecutor.submit(r);
    }

    /**
     * 删除任务
     */
    public void removeTask(Runnable r) {
        initExecutor();
        mThreadPoolExecutor.remove(r);
    }

}

FutureTask
FutureTask是实现了future的Runable,FutureTask比Runable多了一个执行的返回值

 private void test(){

        AsyncTask<Boolean,String,Integer> asyncTask = new AsyncTask<Boolean, String, Integer>() {

            @Override
            protected Integer doInBackground(Boolean... booleans) {
                return null;
            }

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
            }

            @Override
            protected void onPostExecute(Integer integer) {
                super.onPostExecute(integer);
            }

            @Override
            protected void onProgressUpdate(String... values) {
                super.onProgressUpdate(values);
            }

            @Override
            protected void onCancelled(Integer integer) {
                super.onCancelled(integer);
            }

            @Override
            protected void onCancelled() {
                super.onCancelled();
            }
        };
        asyncTask.execute();
        asyncTask.getStatus();

        Callable<Boolean> callable = new Callable<Boolean>() {
            @Override
            public Boolean call() throws Exception {
                return false;
            }
        };
        FutureTask futureTask = new FutureTask(callable );
        futureTask.cancel(true);

        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(
                2,10,300,
                TimeUnit.MICROSECONDS,new LinkedBlockingDeque<Runnable>(),
                Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
        Future<Boolean> future= poolExecutor.submit(callable);
        future.cancel(true);
    }
上一篇下一篇

猜你喜欢

热点阅读