NoHttp封装--06 NoHttp之队列、队列优先级
public class Main {
/**
* 程序入口
*/
public void start() {
// 第一种,先进先出的队列
// YolandaLinkedQueue queue = new YolandaLinkedQueue(3);
// queue.start();
// 第二种,没有顺序的队列
YolandaQueue queue = new YolandaQueue();
queue.start();
// 往队列中添加请求
for (int i = ; i < ; i++) {
Request request = new Request("请求" + i);
if (i == )
request.setPriority(Priority.C);
if (i == )
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 = ; 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 = ; 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();
} 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
}

NoHttp封装--06 NoHttp之队列、队列优先级的更多相关文章
- Java 模拟队列(一般队列、双端队列、优先级队列)
队列: 先进先出,处理类似排队的问题,先排的.先处理,后排的等前面的处理完了,再处理 对于插入和移除操作的时间复杂度都为O(1).从后面插入,从前面移除 双端队列: 即在队列两端都能够insert和r ...
- [ios2]使用NSOperationQueue简化多线程开发和队列的优先级 【转】
多线程开发是一件需要特别精心的事情,即使是对有多年开发经验的工程师来说. 为了能让初级开发工程师也能使用多线程,同时还要简化复杂性.各种编程工具提供了各自的办法.对于iOS来说,建议在尽可能的情况下避 ...
- Hadoop 设置任务执行的队列以及优先级
转自:http://blog.csdn.net/wisgood/article/details/39075883 作业提交到的队列:mapreduce.job.queuename 作业优先级:mapr ...
- java数据结构----队列,优先级队列
1.队列:和栈中的情况不同,队列中的数据项不总是从数组下标0开始,移除一个数据项后,队头指针会指向下标较高的数据项,其特点:先入先出 2.图解 3.队列的实现代码: 3.1.Queue.java pa ...
- java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表
java实现 数据结构:链表. 栈. 队列.优先级队列.哈希表 数据结构javavector工作importlist 最近在准备找工作的事情,就复习了一下java.翻了一下书和网上的教材,发现虽然 ...
- 队列->队列的表示和实现
文字描述 队列是和栈相反,队列是一种先进先出(first in first out,缩写FIFO)的线性表,它只允许在表的一端进行插入,而在另一端进行删除.和生活中的排队相似,最早进入队列的元素最早离 ...
- NoHttp封装--01
NoHttpActivity public class NoHttpActivity extends Activity implements View.OnClickListener { privat ...
- [js高手之路]javascript腾讯面试题学习封装一个简易的异步队列
这道js的面试题,是这样的,页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始技术( 0, 1, 2, ....9 ),首先我们用闭包 ...
- NoHttp封装--03 缓存
1.Default模式,也是没有设置缓存模式时的默认模式 这个模式实现http协议中的内容,比如响应码是304时,当然还会结合E-Tag和LastModify等头. StringRequest req ...
随机推荐
- Vue SSR不可不知的问题
Vue SSR不可不知的问题 本文主要介绍Vue SSR(vue服务端渲染)的应用场景,开发中容易遇到的一些问题,提升ssr性能的方法,以及ssr的安全性问题. ssr的应用场景 1.SEO需求 SE ...
- 项目ITP(五) spring4.0 整合 Quartz 实现任务调度
前言 系列文章:[传送门] 项目需求: 二维码推送到一体机上,给学生签到扫描用.然后需要的是 上课前20分钟 ,幸好在帮带我的学长做 p2p 的时候,接触过.自然 quartz 是首选.所以我就配置了 ...
- Spring Boot 1.5升级2.1 主要问题汇总
我们目前工作的系统是基于Spring Boot 1.5.19.RELEASE.Spring Cloud Edgware.SR3开发的,因为一个新项目开发过程的体验,所以在考虑升级到Spring Boo ...
- leetcode — add-binary
/** * Source : https://oj.leetcode.com/problems/add-binary/ * * * Given two binary strings, return t ...
- Docker 构建映像
.用docker commit构建映像 .docker run -i -t centos /bin/bash //启动一个容器,启动后默认进入该窗口的bash进程 .yum install -y ep ...
- lsyncd —— 多机器实时同步文件神器
lsyncd 是一个支持实时.双向.多机器的多模式文件同步工具. 使用 Lua 语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify ...
- Perl流程控制语句
布尔值判断 如果是数字,0表示假,其它所有数字都是真. 如果是字符串,空字符串('')为假,其它所有字符串为真(有例外,见下一条). 如果是字符串'0',perl是当作数值0来处理的,所以这是唯一的非 ...
- mybatis-generator插件执行报错:Cannot resolve classpath entry
记录一个小问题 使用了mybatis-generator插件自动生成实体类,DAO,Mapper,在执行时报错.报错信息如下 Failed to execute goal org.mybatis.ge ...
- [React] react.js的一些库和用法
React性能优化 记录一次利用 Timeline/Performance工具进行 React性能优化的真实案例 http://www.jianshu.com/p/9b0e9ef0a607 React ...
- for 循环 和 Array 数组对象
博客地址:https://ainyi.com/12 for 循环 和 Array 数组对象方法 for for-in for-of forEach效率比较 - 四种循环,遍历长度为 1000000 的 ...