PriorityBlockingQueue用法
摘自《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));
}
}
PriorityBlockingQueue用法的更多相关文章
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
- jquery插件的用法之cookie 插件
一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法
一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...
- python enumerate 用法
A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...
- [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...
- 【JavaScript】innerHTML、innerText和outerHTML的用法区别
用法: <div id="test"> <span style="color:red">test1</span> tes ...
- chattr用法
[root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...
- 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)
vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...
随机推荐
- python单元测试框架pytest——fixture函数(类似unitest的setup和teardown)
pytest的setup和teardown函数(曾被一家云计算面试官问到过). pytest提供了fixture函数用以在测试执行前和执行后进行必要的准备和清理工作.与python自带的unitest ...
- Linux下多线程下载工具myget
[root@superdba ~]# mytgetMytget 0.0.99: A download accelerator for GNU/LinuxUsage: mytget [options]. ...
- 超级强大的vim配置(vimplus)--续集
An automatic configuration program for vim 安装(github地址:https://github.com/chxuan/vimplus.git, 欢迎star ...
- spring boot开发为什么使用jar包
spring boot既可以打成war发布,也可以找成jar包发布. jar包:直接通过内置tomcat运行,不需要额外安装tomcat.如需修改内置tomcat的配置,只需要在spring boot ...
- 20145328 《Java程序设计》实验五实验报告
20145328 <Java程序设计>实验五实验报告 实验名称 Java网络编程 实验内容 用书上的TCP代码,实现服务器与客户端. 客户端与服务器连接 客户端中输入明文,利用DES算法加 ...
- Linux读书笔记1/2章
linux的内核设计: 第一章 1.1Linux历史: 历经时间的考验,今天Unix已经发展成一个支持抢占式多任务.多线程.虚拟内存.换页.动态链接.TCP/Ip网络的现代化操作系统. 1.2追寻Li ...
- $(document).ready(function(){})和$(window).load(function(){})的区别
页面加载完成有两种状态: 1.Ready:表示文档结构已经加载完成,不包含图片等非文字媒体文件,在Dom节点创建完成后执行,如果有多个定义则依次执行 $(document).ready(functio ...
- DVWA安装
DVWA安装: 启动xampp下的apache中间件和mysql 将dvwa放到xampp下的htdocs目录下 在浏览器输入http://127.0.0.1/dvwa 即可使用啦! 还有owasp的 ...
- Commons Configuration之一简介
转载自(https://my.oschina.net/u/2000201/blog/486327) 1 简介 Commons Configuration软件类库提供通用配置接口,使Java应用程 ...
- 使用@Named注解绑定多个实现(java,scala)
版权申明:转载请注明出处. 文章来源:http://bigdataer.net/?p=330 排版乱?请移步原文获得更好的阅读体验 1.背景 最近项目中使用了guice作为依赖注入的框架.碰到一个如下 ...