zoukankan      html  css  js  c++  java
  • NoHttp封装--06 NoHttp之队列、队列优先级

    public class Main {
    
        /**
         * 程序入口
         */
        public void start() {
            // 第一种,先进先出的队列
            // YolandaLinkedQueue queue = new YolandaLinkedQueue(3);
            // queue.start();
            // 第二种,没有顺序的队列
            YolandaQueue queue = new YolandaQueue(1);
            queue.start();
            // 往队列中添加请求
            for (int i = 0; i < 20; i++) {
                Request request = new Request("请求" + i);
                if (i == 10)
                    request.setPriority(Priority.C);
                if (i == 15)
                    request.setPriority(Priority.D);
                queue.add(request);
            }
        }
    
        public static void main(String[] args) {
            Main main = new Main();
            main.start();
        }
    
    }
    
    public class YolandaLinkedQueue {
    
        private BlockingQueue<Request> blockingQueue;
    
        private TaskExecutor[] taskExecutors;
    
        public YolandaLinkedQueue(int poolSize) {
            // LinkedBlockingQueue是一个先进先出的队列
            blockingQueue = new LinkedBlockingQueue<>();
            taskExecutors = new TaskExecutor[poolSize];
        }
    
        public void add(Request request) {
            blockingQueue.add(request);
        }
    
        public void start() {
            for (int i = 0; i < taskExecutors.length; i++) {
                taskExecutors[i] = new TaskExecutor(blockingQueue);
                taskExecutors[i].start();
            }
        }
    
        public void stop() {
            for (TaskExecutor taskExecutor : taskExecutors) {
                taskExecutor.setRunning(false);
                taskExecutor.interrupt();
            }
        }
    
    }
    
    public class YolandaQueue {
    
        private BlockingQueue<Request> blockingQueue;
    
        private TaskExecutor[] taskExecutors;
    
        private AtomicInteger atomicInteger = new AtomicInteger();
    
        public YolandaQueue(int poolSize) {
            // 如果Comparable#compareTo(Object)方法不做比较返回0,那么是无序的
            blockingQueue = new PriorityBlockingQueue<Request>();
            taskExecutors = new TaskExecutor[poolSize];
        }
    
        public void add(Request request) {
            request.setOrder(atomicInteger.incrementAndGet());
            blockingQueue.add(request);
        }
    
        public void start() {
            for (int i = 0; i < taskExecutors.length; i++) {
                taskExecutors[i] = new TaskExecutor(blockingQueue);
                taskExecutors[i].start();
            }
        }
    
        public void stop() {
            for (TaskExecutor taskExecutor : taskExecutors) {
                taskExecutor.setRunning(false);
                taskExecutor.interrupt();
            }
        }
    
    }
    
    public class TaskExecutor extends Thread {
    
        private BlockingQueue<Request> blockingQueue;
    
        private boolean isRunning = true;
    
        public TaskExecutor(BlockingQueue<Request> blockingQueue) {
            this.blockingQueue = blockingQueue;
        }
    
        /**
         * @param isRunning the isRunning to set
         */
        public void setRunning(boolean isRunning) {
            this.isRunning = isRunning;
        }
    
        @Override
        public void run() {
            while (isRunning) {
                Request request = null;
                try {
                    // take方法是一个阻塞的方法,每次调用会拿到队列中的第一个任务,如果队列为空,这个方法将一直阻塞,知道队列中有任务再次返回
                    request = blockingQueue.take();
                } catch (InterruptedException e) {
                    return;
                }
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(request.getName());
            }
        }
    
    }
    
    public class Request implements Comparable<Request> {
    
        private String name;
    
        private Priority mPriority = Priority.B;
    
        private int order;
    
        /**
         * @param name
         */
        public Request(String name) {
            super();
            this.name = name;
        }
    
        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
    
        /**
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
    
        /**
         * @param mPriority the mPriority to set
         */
        public void setPriority(Priority mPriority) {
            this.mPriority = mPriority;
        }
    
        /**
         * @return the mPriority
         */
        public Priority getPriority() {
            return mPriority;
        }
    
        /**
         * @return the order
         */
        public int getOrder() {
            return order;
        }
    
        /**
         * @param order the order to set
         */
        public void setOrder(int order) {
            this.order = order;
        }
    
        @Override
        public int compareTo(Request other) {
            // 返回正数代表1排在2后面,返回负数表示1排在2前面
            Priority priority = getPriority();// 拿到自身的优先级
            Priority otherPriority = other.getPriority();
            return priority == otherPriority ? getOrder() - other.getOrder() : otherPriority.ordinal() - priority.ordinal();
        }
    
    }
    
    public enum Priority {
    
        /**
         * 优先级最低
         */
        A,
    
        /**
         * 默认优先级
         */
        B,
    
        /**
         * 优先级最高
         */
        C,
    
        /**
         * 一般情况下不用;特殊情况下,请求假如到到队列后立即执行
         */
        D
    
    }

     

  • 相关阅读:
    springboot配置视图控制器
    springboot测试的方法
    cookie之sameSite
    docker 安装Elasticsearch +kibana
    find + xargs 删除文件名中含有空格的文件
    git,composer 代理
    Composer更新依赖报错Fatal error解决方案
    compose 设置代理 SET HTTP_PROXY="http://192.168.1.103:8080"
    php使用composer常用问题及解决办法集:zlib_decode():data error......
    ERROR: .FileNotFoundError: [Errno 2] No such file or directory: '.\docker-compose.yml:docker-compose.apache.yml'
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/9038596.html
Copyright © 2011-2022 走看看