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 ...
随机推荐
- spring boot -整合Ehcahe
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...
- Spring中Model、ModelMap及ModelAndView之间的区别+传递参数
org.springframework.ui.Model(接口)传递数据,Spring框架自动创建它的一个实现类,如BindingAwareModelMap org.springframework.u ...
- 一条sql解决.一张表的数据复制到另外一张表
如何把一个表的数组复制到一张表?也许很多人会把这个表查出来的数据再插入到另外一张表里面,这样很麻烦又要写代码逻辑去处理,其实一条sql语句就可以把一张表的数据复制到另外一张表,或者一张表的某一条数据复 ...
- InnoDB多版本
InnoDB是一个多版本的存储引擎:为了支持事务的一些特性诸如并发和回滚,它保持着被修改行的旧版本信息.这些信息被存储在一个被叫做“回滚段”的表空间中(跟Oracle中的回滚段类似).InnoDB在回 ...
- mysql 开发进阶篇系列 50 表的数据导入(load data infile,mysqlimport )
一.概述 上篇讲到的表的数据导出(select .. into outfile 或者mysqldump),这篇继续讲表的数据导入,导入也同样有二个方法,分别是load data infile... 和 ...
- Android--Service之基础
前言 本篇博客聊一下Android下的Service组件,对于Service组件,有点类似于Windows下的服务.Service是Android四大组件中与Activity最相似的组件,它们的区别在 ...
- Android--UI之Fragment
前言 开门见山开篇名义,本篇博客将讲解一下Android中Fragment的内容,必要的地方会提供相应的演示代码,并且会在最后给出源码下载. 本文主要有以下内容: 什么是Fragment 如何创建一个 ...
- Android--Menus
前言 本篇博客讲解一下菜单Menu的使用.菜单在windows应用中使用十分广泛,几乎所有的windows应用都有菜单,Android中也加入了菜单的支持.从官方文档了解到,从Android3.0(A ...
- [机器学习] 分类 --- Naive Bayes(朴素贝叶斯)
Naive Bayes-朴素贝叶斯 Bayes' theorem(贝叶斯法则) 在概率论和统计学中,Bayes' theorem(贝叶斯法则)根据事件的先验知识描述事件的概率.贝叶斯法则表达式如下所示 ...
- SHELL脚本--数学运算和bc命令
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 使用let.(()).$(())或$[]进行基本的整数运算,使 ...