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之队列、队列优先级的更多相关文章

  1. Java 模拟队列(一般队列、双端队列、优先级队列)

    队列: 先进先出,处理类似排队的问题,先排的.先处理,后排的等前面的处理完了,再处理 对于插入和移除操作的时间复杂度都为O(1).从后面插入,从前面移除 双端队列: 即在队列两端都能够insert和r ...

  2. [ios2]使用NSOperationQueue简化多线程开发和队列的优先级 【转】

    多线程开发是一件需要特别精心的事情,即使是对有多年开发经验的工程师来说. 为了能让初级开发工程师也能使用多线程,同时还要简化复杂性.各种编程工具提供了各自的办法.对于iOS来说,建议在尽可能的情况下避 ...

  3. Hadoop 设置任务执行的队列以及优先级

    转自:http://blog.csdn.net/wisgood/article/details/39075883 作业提交到的队列:mapreduce.job.queuename 作业优先级:mapr ...

  4. java数据结构----队列,优先级队列

    1.队列:和栈中的情况不同,队列中的数据项不总是从数组下标0开始,移除一个数据项后,队头指针会指向下标较高的数据项,其特点:先入先出 2.图解 3.队列的实现代码: 3.1.Queue.java pa ...

  5. java实现 数据结构:链表、 栈、 队列、优先级队列、哈希表

    java实现 数据结构:链表. 栈. 队列.优先级队列.哈希表   数据结构javavector工作importlist 最近在准备找工作的事情,就复习了一下java.翻了一下书和网上的教材,发现虽然 ...

  6. 队列->队列的表示和实现

    文字描述 队列是和栈相反,队列是一种先进先出(first in first out,缩写FIFO)的线性表,它只允许在表的一端进行插入,而在另一端进行删除.和生活中的排队相似,最早进入队列的元素最早离 ...

  7. NoHttp封装--01

    NoHttpActivity public class NoHttpActivity extends Activity implements View.OnClickListener { privat ...

  8. [js高手之路]javascript腾讯面试题学习封装一个简易的异步队列

    这道js的面试题,是这样的,页面上有一个按钮,一个ul,点击按钮的时候,每隔1秒钟向ul的后面追加一个li, 一共追加10个,li的内容从0开始技术( 0, 1, 2, ....9 ),首先我们用闭包 ...

  9. NoHttp封装--03 缓存

    1.Default模式,也是没有设置缓存模式时的默认模式 这个模式实现http协议中的内容,比如响应码是304时,当然还会结合E-Tag和LastModify等头. StringRequest req ...

随机推荐

  1. spring boot -整合Ehcahe

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ...

  2. Spring中Model、ModelMap及ModelAndView之间的区别+传递参数

    org.springframework.ui.Model(接口)传递数据,Spring框架自动创建它的一个实现类,如BindingAwareModelMap org.springframework.u ...

  3. 一条sql解决.一张表的数据复制到另外一张表

    如何把一个表的数组复制到一张表?也许很多人会把这个表查出来的数据再插入到另外一张表里面,这样很麻烦又要写代码逻辑去处理,其实一条sql语句就可以把一张表的数据复制到另外一张表,或者一张表的某一条数据复 ...

  4. InnoDB多版本

    InnoDB是一个多版本的存储引擎:为了支持事务的一些特性诸如并发和回滚,它保持着被修改行的旧版本信息.这些信息被存储在一个被叫做“回滚段”的表空间中(跟Oracle中的回滚段类似).InnoDB在回 ...

  5. mysql 开发进阶篇系列 50 表的数据导入(load data infile,mysqlimport )

    一.概述 上篇讲到的表的数据导出(select .. into outfile 或者mysqldump),这篇继续讲表的数据导入,导入也同样有二个方法,分别是load data infile... 和 ...

  6. Android--Service之基础

    前言 本篇博客聊一下Android下的Service组件,对于Service组件,有点类似于Windows下的服务.Service是Android四大组件中与Activity最相似的组件,它们的区别在 ...

  7. Android--UI之Fragment

    前言 开门见山开篇名义,本篇博客将讲解一下Android中Fragment的内容,必要的地方会提供相应的演示代码,并且会在最后给出源码下载. 本文主要有以下内容: 什么是Fragment 如何创建一个 ...

  8. Android--Menus

    前言 本篇博客讲解一下菜单Menu的使用.菜单在windows应用中使用十分广泛,几乎所有的windows应用都有菜单,Android中也加入了菜单的支持.从官方文档了解到,从Android3.0(A ...

  9. [机器学习] 分类 --- Naive Bayes(朴素贝叶斯)

    Naive Bayes-朴素贝叶斯 Bayes' theorem(贝叶斯法则) 在概率论和统计学中,Bayes' theorem(贝叶斯法则)根据事件的先验知识描述事件的概率.贝叶斯法则表达式如下所示 ...

  10. SHELL脚本--数学运算和bc命令

    bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 使用let.(()).$(())或$[]进行基本的整数运算,使 ...