• Android自定义线程池——转载


    定义线程优先级枚举
    /**
     * 线程优先级
     */
    public enum Priority {
        HIGH, NORMAL, LOW
    }
    定义线程任务
    /**
     * 带有优先级的Runnable类型
     */
    /*package*/ class PriorityRunnable implements Runnable {
    
        public final Priority priority;//任务优先级
        private final Runnable runnable;//任务真正执行者
        /*package*/ long SEQ;//任务唯一标示
    
        public PriorityRunnable(Priority priority, Runnable runnable) {
            this.priority = priority == null ? Priority.NORMAL : priority;
            this.runnable = runnable;
        }
    
        @Override
        public final void run() {
            this.runnable.run();
        }
    }
    定义一个PriorityExecutor继承ThreadPoolExecutor
    public class PriorityExecutor extends ThreadPoolExecutor {
    
        private static final int CORE_POOL_SIZE = 5;//核心线程池大小
        private static final int MAXIMUM_POOL_SIZE = 256;//最大线程池队列大小
        private static final int KEEP_ALIVE = 1;//保持存活时间,当线程数大于corePoolSize的空闲线程能保持的最大时间。
        private static final AtomicLong SEQ_SEED = new AtomicLong(0);//主要获取添加任务
    
        /**
         * 创建线程工厂
         */
        private static final ThreadFactory sThreadFactory = new ThreadFactory() {
            private final AtomicInteger mCount = new AtomicInteger(1);
    
            @Override
            public Thread newThread(Runnable runnable) {
                return new Thread(runnable, "download#" + mCount.getAndIncrement());
            }
        };
    
    
        /**
         * 线程队列方式 先进先出
         */
        private static final Comparator<Runnable> FIFO = new Comparator<Runnable>() {
            @Override
            public int compare(Runnable lhs, Runnable rhs) {
                if (lhs instanceof PriorityRunnable && rhs instanceof PriorityRunnable) {
                    PriorityRunnable lpr = ((PriorityRunnable) lhs);
                    PriorityRunnable rpr = ((PriorityRunnable) rhs);
                    int result = lpr.priority.ordinal() - rpr.priority.ordinal();
                    return result == 0 ? (int) (lpr.SEQ - rpr.SEQ) : result;
                } else {
                    return 0;
                }
            }
        };
    
        /**
         * 线程队列方式 后进先出
         */
        private static final Comparator<Runnable> LIFO = new Comparator<Runnable>() {
            @Override
            public int compare(Runnable lhs, Runnable rhs) {
                if (lhs instanceof PriorityRunnable && rhs instanceof PriorityRunnable) {
                    PriorityRunnable lpr = ((PriorityRunnable) lhs);
                    PriorityRunnable rpr = ((PriorityRunnable) rhs);
                    int result = lpr.priority.ordinal() - rpr.priority.ordinal();
                    return result == 0 ? (int) (rpr.SEQ - lpr.SEQ) : result;
                } else {
                    return 0;
                }
            }
        };
    
        /**
         * 默认工作线程数5
         *
         * @param fifo 优先级相同时, 等待队列的是否优先执行先加入的任务.
         */
        public PriorityExecutor(boolean fifo) {
            this(CORE_POOL_SIZE, fifo);
        }
    
        /**
         * @param poolSize 工作线程数
         * @param fifo     优先级相同时, 等待队列的是否优先执行先加入的任务.
         */
        public PriorityExecutor(int poolSize, boolean fifo) {
            this(poolSize, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, new PriorityBlockingQueue<Runnable>(MAXIMUM_POOL_SIZE, fifo ? FIFO : LIFO), sThreadFactory);
        }
    
        public PriorityExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
            super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
        }
    
        /**
         * 判断当前线程池是否繁忙
         * @return
         */
        public boolean isBusy() {
            return getActiveCount() >= getCorePoolSize();
        }
    
        /**
         * 提交任务
         * @param runnable
         */
        @Override
        public void execute(Runnable runnable) {
            if (runnable instanceof PriorityRunnable) {
                ((PriorityRunnable) runnable).SEQ = SEQ_SEED.getAndIncrement();
            }
            super.execute(runnable);
        }
    }
    测试程序
    ExecutorService executorService = new PriorityExecutor(5, false);
            for (int i = 0; i < 20; i++) {
                PriorityRunnable priorityRunnable = new PriorityRunnable(Priority.NORMAL, new Runnable() {
                    @Override
                    public void run() {
                        Log.e(TAG, Thread.currentThread().getName()+"优先级正常");
                    }
                });
                if (i % 3 == 1) {
                    priorityRunnable = new PriorityRunnable(Priority.HIGH, new Runnable() {
                        @Override
                        public void run() {
                            Log.e(TAG, Thread.currentThread().getName()+"优先级高");
                        }
                    });
                } else if (i % 5 == 0) {
                    priorityRunnable = new PriorityRunnable(Priority.LOW, new Runnable() {
                        @Override
                        public void run() {
                            Log.e(TAG, Thread.currentThread().getName()+"优先级低");
                        }
                    });
                }
                executorService.execute(priorityRunnable);
            }

    最后

    1、把run的那一块换成你自己的多线程显示代码。

    2、转载地址:https://www.cnblogs.com/whoislcj/p/5610903.html

  • 相关阅读:
    C++ 模板实现败者树,进行多路归并
    CentOS 7 使用 Realtek 8188eu 上网 (解决 Required key not available)
    C++ Concurrency in Action 读书笔记
    Linux操作系统是如何工作的
    大型项目使用Automake/Autoconf完成编译配置
    Socket 用于进程间通信 --- UNIX Domain Socket
    在Linux中实现类似windows中获取配置文 件的函数GetProfileString
    Linux Shell 1
    YAML
    ubuntu虚拟机如何连接到windows上安装的Navicat
  • 原文地址:https://www.cnblogs.com/hahayixiao/p/15405203.html
Copyright © 2020-2023  润新知