摘自《Java编程思想》

package com.test.concurrency;

import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.TimeUnit; class PrioritizedTask implements Runnable, Comparable<PrioritizedTask>
{
private Random rand = new Random(47);
private static int counter = 0;
private final int id = counter++;
private final int priority;// 用于表示当前任务的执行优先级 protected static List<PrioritizedTask> sequence = new ArrayList<PrioritizedTask>(); public PrioritizedTask(int priority)
{
this.priority = priority;
sequence.add(this);
}
/**
* 用于比较任务的优先级
*/
@Override
public int compareTo(PrioritizedTask o)
{
return priority < o.priority ? 1 : (priority > o.priority ? -1 : 0);
} @Override
public void run()
{
try
{
TimeUnit.MILLISECONDS.sleep(rand.nextInt(250));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(this);
} @Override
public String toString()
{
return String.format("[%1$-3d]", priority) + " Task " + id;
} public String summary()
{
return "(" + id + ":" + priority + ")";
} } /**
* 该任务负责展示当前sequence中的任务与正常执行的任务进行对比以及停止线程
*/
class EndSentinel extends PrioritizedTask
{
private ExecutorService exec; public EndSentinel(ExecutorService e)
{
super(-1);
exec = e;
} public void run()
{
int count = 0;
for (PrioritizedTask pt : sequence)
{
System.out.println(pt.summary());
if (++count % 5 == 0)
{
System.out.println();
}
}
System.out.println();
System.out.println(this + " Calling shutdownNow");
exec.shutdownNow();
}
} /**
*负责生成任务,分别造不同级别的任务添加到执行队列中
*
*/
class PrioritizedTaskProduncer implements Runnable
{
private Random rand = new Random(47);
private Queue<Runnable> queue;
private ExecutorService exec; public PrioritizedTaskProduncer(Queue<Runnable> q, ExecutorService e)
{
queue = q;
exec = e;
} @Override
public void run()
{
//20个不同优先级的任务,通过随机数来产生
for (int i = 0; i < 20; i++)
{
queue.add(new PrioritizedTask(rand.nextInt(10)));
Thread.yield();
}
try
{
//20个优先级高的任务
for (int i = 0; i < 10; i++)
{ TimeUnit.MILLISECONDS.sleep(250);
queue.add(new PrioritizedTask(10));
}
//优先级0-9的执行任务
for (int i = 0; i < 10; i++)
{
queue.add(new PrioritizedTask(i));
} queue.add(new EndSentinel(exec));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("Finished PrioritizedTaskProducer");
}
}
/**
*负责消费任务
*/
class PrioritizedTaskConsumer implements Runnable
{
private PriorityBlockingQueue<Runnable> q; public PrioritizedTaskConsumer(PriorityBlockingQueue<Runnable> q)
{
this.q = q;
} @Override
public void run()
{
try
{
while (!Thread.interrupted())
{
q.take().run();
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("Finished PrioritizedTaskConsumer");
}
} public class PriorityBlockingQueueDemo
{
public static void main(String[] args) throws InterruptedException
{
ExecutorService exec = Executors.newCachedThreadPool();
PriorityBlockingQueue<Runnable> queue = new PriorityBlockingQueue<Runnable>();
exec.execute(new PrioritizedTaskProduncer(queue, exec));
//此处需特别注意,需要等待所有的任务已经生成完后,再执行消费,否则,可能会看到消费并非按照优先级执行的
Thread.sleep(5000);
exec.execute(new PrioritizedTaskConsumer(queue));
}
}

最新文章

  1. javaScript的内置对象
  2. 剑指Offer面试题:18.二叉树的镜像
  3. Android Handler机制
  4. C#获取CSV文件内容对逗号和引号分隔的处理
  5. maven 三个基本插件 clean dependency compiler
  6. TextView显示颜色高亮的问题
  7. 与众不同 windows phone (38) - 8.0 关联启动: 使用外部程序打开一个文件或URI, 关联指定的文件类型或协议
  8. hdu 栈题1022&amp;1702
  9. Java序列化 如何把多个对象存储在一个文件中
  10. ecshop里的$_CFG从哪来的
  11. [Lua]Lua入门教程
  12. GIT-Linux(CentOS7)系统部署git服务器
  13. python爬虫学习之正则表达式的基本使用
  14. 异步编程(async&amp;await)
  15. Spring Boot 揭秘与实战(九) 应用监控篇 - 自定义监控端点
  16. Apache Kafka系列(一) 起步
  17. [WPF打印]WPF 文档元素(Run TextBlock Paragraph)的文字对齐方式
  18. Hibernate之Hibernate环境搭建
  19. Java实现的各种排序算法(包括冒泡,快排等)
  20. day1 python简介和入门

热门文章

  1. python单元测试框架——pytest
  2. java中内部类的积累
  3. Mac中MacPorts安装和使用 MacPorts简介
  4. Live Score FAQ
  5. python sklearn.cross_validation 模块导入失败
  6. javascript中关于&amp;&amp; 和 || 表达式的小技巧分享
  7. poj 3461 - Oulipo 经典kmp算法问题
  8. [小问题笔记(六)] 解决JS已执行,输出内容乱码问题. 顺带总结编码相关知识
  9. Mysql数据库实用语句集
  10. 文件load事件:img、iframe