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",我在无意中发现了它们所具有的相同的一些用法,先举 ...
随机推荐
- bind函数的作用
面向连接的网络应用程序分为客户端和服务器端.服务器端的执行流程一般为4步,客户端程序相对简单,一般需要两个步骤. 服务器端执行流程4步如下: (1)调用socket函数,建立一个套接字,该套接字用于接 ...
- ROS学习
随着机器人领域的快速发展和复杂化,代码的复用性和模块化的需求原来越强烈,而已有的开源机器人系统又不能很好的适应需求.2010年Willow Garage公司发布了开源机器人操作系统ROS(robot ...
- 20145302张薇《Java程序设计》实验五报告
20145302张薇 实验五:Java网络编程及安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 基于Java Socket实现安全传输 基于TCP实现 ...
- 动态 K th
每一棵线段树是维护每一个序列前缀的值在任意区间的个数,如果还是按照静态的来做的话,那么每一次修改都要遍历O(n)棵树,时间就是O(2*M*nlogn)->TLE考虑到前缀和,我们通过树状数组来优 ...
- [翻译]纠正PostCSS的4大认识误区
市面上已经有很多的前端工具,再来引入新的前端工具,价值大不大?这主要取决于,它是否给开发人员提供了新的功能,是否值得花时间和精力去学习和使用? PostCSS出现时有一个很有趣的现象.像sass和le ...
- ubuntu18.04编译openwrt前的准备
1.获取openwrt源码 git clone https://github.com/openwrt/openwrt.git 2.安装一些库及必备程序: sudo apt-get install li ...
- LeetCode——largest-rectangle-in-histogram1
Question Given n non-negative integers representing the histogram's bar height where the width of ea ...
- [源码解读] ResNet源码解读(pytorch)
自己看读完pytorch封装的源码后,自己又重新写了一边(模仿其书写格式), 一些问题在代码中说明. import torch import torchvision import argparse i ...
- ubuntu16.04后续工作
一.ruijie https://blog.csdn.net/u012217085/article/details/24369335 https://blog.csdn.net/Lv_Victor/a ...
- LightOJ 1356 Prime Independence(质因数分解+最大独立集+Hopcroft-Carp)
http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1356 题意: 给出n个数,问最多能选几个数,使得该集合中的 ...