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 ...
随机推荐
- [原创]K8 Cscan 3.6大型内网渗透自定义扫描器
前言:无论内网还是外网渗透信息收集都是非常关键,信息收集越多越准确渗透的成功率就越高但成功率还受到漏洞影响,漏洞受时效性影响,对于大型内网扫描速度直接影响着成功率漏洞时效性1-2天,扫描内网或外网需1 ...
- 原生JS实现弹幕效果
纯属无聊写的,可能有很多问题,欢迎批评指教. 效果图:图一是预设的一些弹幕,图二是自己发射的弹幕,效果是一样的. 首先是弹幕的位置,是要从最右滑到最左,为了防止随机高度弹幕会覆盖的问题,设置了通道 ...
- 原生端与服务器通过sessionid实现session共享以及登录验证
注:原生端与服务器建立连接时产生的sessionid会变,跟上一次的不一样,为了保证sessionid一样,所以第一次服务器需要把sessionid返回给原生端,下一次与服务端会话时,原生端需要把这个 ...
- linux 命令 — cut
cut 以列的方式格式化输出 依赖定界符 cut -f field_list filename 以默认定界符(tab,制表符)分割文件的列,输出指定的列field_list,field_list由列号 ...
- React hooks实践
前言 最近要对旧的项目进行重构,统一使用全新的react技术栈.同时,我们也决定尝试使用React hooks来进行开发,但是,由于React hooks崇尚的是使用(也只能使用)function c ...
- MySql的创建时间和修改时间
在创建时间字段的时候 DEFAULT CURRENT_TIMESTAMP表示当插入数据的时候,该字段默认值为当前时间 ON UPDATE CURRENT_TIMESTAMP表示每次更新这条数据的时 ...
- vue_drf之实现极验滑动验证码
一.需求 1,场景 我们在很多登录和注册场景里,为了避免某些恶意攻击程序,我们会添加一些验证码,也就是行为验证,让我们相信现在是一个人在交互,而不是一段爬虫程序.现在市面上用的比较多的,比较流行的是极 ...
- Asp.Net 之 Web.config 配置文件详解
在asp.net中配置文件名一般默认是web.config.每个web.config文件都是基于XML的文本文件,并且可以保存到Web应用程序中的任何目录中.在发布Web应用程序时web.config ...
- Spring Boot搭建Web项目常用功能
搭建WEB项目过程中,哪些点需要注意: 1.技术选型: 前端:freemarker.vue 后端:spring boot.spring mvc 2.如何包装返回统一结构结果数据? 首先要弄清楚为什么要 ...
- vue-element-admin项目install出现的问题
1.需要安装nodejs和git 2. 配置淘宝镜像源(经常是因为墙的原因下载缓慢或者出错) npm config set registry https://registry.npm.taobao.o ...