java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.
java PriorityBlockingQueue 基于优先级队列。的读出操作可以阻止.
package org.rui.thread.newc; 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; /***
* 这是一个基于优选级队列。它具有可堵塞的读取操作。 * 以下是一个演示样例,当中在优级级队列的对象是依照优级级顺序从队列中出现的任务。 * prioritizedTask被赋予了一个优先级数字, 以此来提供这样的顺序。
* @author lenovo
*
*/ 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)
{
// Acceptable way to exit 可接受的方式退出 }
System.out.println("PrioritizedTask run: " + this);
} @Override
public String toString()
{
return String.format("[%1$-3d]", priority) + " =Task >>id: " + id; } public String summary()
{
return "(id:" + id + " priority:" + priority + ")";
} // //
public static class endSentinel extends PrioritizedTask
{
private ExecutorService exec; public endSentinel(ExecutorService e)
{
super(-1);// lowest priority in this program 最低优先级
exec = e;
} @Override
public void run()
{
int count = 0;
for (PrioritizedTask pt : sequence)
{
System.out.println("summary汇总: "+pt.summary());
if (++count % 5 == 0)
{
System.out.println();
}
}
System.out.println();
System.out.println(this + " calling shutdownNow");
exec.shutdownNow();
}
}
} // //////////////生产者////////
class prioritizedTaskProducer implements Runnable
{
private Random rand = new Random(47);
private Queue<Runnable> queue; private ExecutorService exec; public prioritizedTaskProducer(Queue<Runnable> q, ExecutorService e)
{
queue = q;
exec = e;// used for end sentinel 用于结束哨兵 } @Override
public void run()
{
// unbounded queue ; never blocks 无界队列;从不堵塞
// fill it up fast with random priorities 把它填平高速随机的优先级
for (int i = 0; i < 20; i++)
{
int temp=0;
System.out.println("入队列>>随机20>>10>inner:"+(temp=rand.nextInt(10)));
queue.add(new PrioritizedTask(temp));
Thread.yield();// 让当前线程回到可运行状态,以便让具有同样优先级的线程进入运行状态,但不是绝对的。 由于虚拟机可能会让该线程又一次进入运行状态。
} // trickle in highest-priority jobs 细流在最高优先级的工作
try
{ //放入10 个10
for (int i = 0; i < 10; i++)
{
System.out.println("入队列>>指定10>>10个:"+10);
TimeUnit.MILLISECONDS.sleep(2500);
queue.add(new PrioritizedTask(10));
} for (int i = 0; i < 10; i++)
{
System.out.println("入队列>>自增>>10>0-10:"+i); // add jobs lowest priority first: 加入工作 最低优先级:
queue.add(new PrioritizedTask(i));
} // a sentinel to stop all the tasks 哨兵停止全部的任务
queue.add(new PrioritizedTask.endSentinel(exec));
} catch (InterruptedException e)
{
// 可接受的方式退出
System.out.println("InterruptedException >>143");
}
System.out.println("完毕 prioritizedTaskProducer");
} } // //消费者////PriorityBlockingQueue/////////
class prioritizedTaskConsumer implements Runnable
{
private PriorityBlockingQueue<Runnable> q; public prioritizedTaskConsumer(PriorityBlockingQueue<Runnable> q)
{
this.q = q;
} @Override
public void run()
{
try
{
while (!Thread.interrupted())
{
// use current thread to run the task 使用当前线程运行的任务
q.take().run(); }
} catch (InterruptedException e)
{
// acceptable way to exit
} System.out.println("完毕 prioritizedTaskConsumer"); }
} /***
* main
* @author lenovo
*
*/
public class PriorityBlockingQueueDemo
{ public static void main(String[] args) throws InterruptedException
{
Random randx = new Random(47);
int c = randx.nextInt(250);
System.out.println(c); ExecutorService exec = Executors.newCachedThreadPool();
PriorityBlockingQueue<Runnable> queue = new PriorityBlockingQueue<Runnable>();
exec.execute(new prioritizedTaskProducer(queue, exec));// 生产者 // Thread.sleep(8000);
exec.execute(new prioritizedTaskConsumer(queue));// 消费者
} } /**
output: sle---
入队列>>随机20>>10>inner:8
入队列>>随机20>>10>inner:5
入队列>>随机20>>10>inner:3
入队列>>随机20>>10>inner:1
入队列>>随机20>>10>inner:1
入队列>>随机20>>10>inner:9
入队列>>随机20>>10>inner:8
入队列>>随机20>>10>inner:0
入队列>>随机20>>10>inner:2
入队列>>随机20>>10>inner:7
入队列>>随机20>>10>inner:8
入队列>>随机20>>10>inner:8
入队列>>随机20>>10>inner:1
入队列>>随机20>>10>inner:9
入队列>>随机20>>10>inner:9
入队列>>随机20>>10>inner:8
入队列>>随机20>>10>inner:8
入队列>>随机20>>10>inner:1
入队列>>随机20>>10>inner:0
入队列>>随机20>>10>inner:8
入队列>>指定10>>10个:10
入队列>>指定10>>10个:10
入队列>>指定10>>10个:10
入队列>>指定10>>10个:10
PrioritizedTask run: [10 ] =Task >>id: 20
PrioritizedTask run: [10 ] =Task >>id: 21
PrioritizedTask run: [10 ] =Task >>id: 22
PrioritizedTask run: [9 ] =Task >>id: 5
PrioritizedTask run: [9 ] =Task >>id: 13
PrioritizedTask run: [9 ] =Task >>id: 14
PrioritizedTask run: [8 ] =Task >>id: 15
PrioritizedTask run: [8 ] =Task >>id: 16
PrioritizedTask run: [8 ] =Task >>id: 19
PrioritizedTask run: [8 ] =Task >>id: 0
PrioritizedTask run: [8 ] =Task >>id: 10
PrioritizedTask run: [8 ] =Task >>id: 11
PrioritizedTask run: [8 ] =Task >>id: 6
PrioritizedTask run: [7 ] =Task >>id: 9
PrioritizedTask run: [5 ] =Task >>id: 1
PrioritizedTask run: [3 ] =Task >>id: 2
PrioritizedTask run: [2 ] =Task >>id: 8
PrioritizedTask run: [1 ] =Task >>id: 12
PrioritizedTask run: [1 ] =Task >>id: 17
PrioritizedTask run: [1 ] =Task >>id: 4
PrioritizedTask run: [1 ] =Task >>id: 3
PrioritizedTask run: [0 ] =Task >>id: 7
PrioritizedTask run: [0 ] =Task >>id: 18
入队列>>指定10>>10个:10
PrioritizedTask run: [10 ] =Task >>id: 23
入队列>>指定10>>10个:10
PrioritizedTask run: [10 ] =Task >>id: 24
入队列>>指定10>>10个:10
PrioritizedTask run: [10 ] =Task >>id: 25
入队列>>指定10>>10个:10
PrioritizedTask run: [10 ] =Task >>id: 26
入队列>>指定10>>10个:10
PrioritizedTask run: [10 ] =Task >>id: 27
入队列>>指定10>>10个:10
PrioritizedTask run: [10 ] =Task >>id: 28
入队列>>自增>>10>0-10:0
入队列>>自增>>10>0-10:1
入队列>>自增>>10>0-10:2
入队列>>自增>>10>0-10:3
入队列>>自增>>10>0-10:4
入队列>>自增>>10>0-10:5
入队列>>自增>>10>0-10:6
入队列>>自增>>10>0-10:7
入队列>>自增>>10>0-10:8
入队列>>自增>>10>0-10:9
完毕 prioritizedTaskProducer
PrioritizedTask run: [10 ] =Task >>id: 29
PrioritizedTask run: [9 ] =Task >>id: 39
PrioritizedTask run: [8 ] =Task >>id: 38
PrioritizedTask run: [7 ] =Task >>id: 37
PrioritizedTask run: [6 ] =Task >>id: 36
PrioritizedTask run: [5 ] =Task >>id: 35
PrioritizedTask run: [4 ] =Task >>id: 34
PrioritizedTask run: [3 ] =Task >>id: 33
PrioritizedTask run: [2 ] =Task >>id: 32
PrioritizedTask run: [1 ] =Task >>id: 31
PrioritizedTask run: [0 ] =Task >>id: 30
summary汇总: (id:0 priority:8)
summary汇总: (id:1 priority:5)
summary汇总: (id:2 priority:3)
summary汇总: (id:3 priority:1)
summary汇总: (id:4 priority:1) summary汇总: (id:5 priority:9)
summary汇总: (id:6 priority:8)
summary汇总: (id:7 priority:0)
summary汇总: (id:8 priority:2)
summary汇总: (id:9 priority:7) summary汇总: (id:10 priority:8)
summary汇总: (id:11 priority:8)
summary汇总: (id:12 priority:1)
summary汇总: (id:13 priority:9)
summary汇总: (id:14 priority:9) summary汇总: (id:15 priority:8)
summary汇总: (id:16 priority:8)
summary汇总: (id:17 priority:1)
summary汇总: (id:18 priority:0)
summary汇总: (id:19 priority:8) summary汇总: (id:20 priority:10)
summary汇总: (id:21 priority:10)
summary汇总: (id:22 priority:10)
summary汇总: (id:23 priority:10)
summary汇总: (id:24 priority:10) summary汇总: (id:25 priority:10)
summary汇总: (id:26 priority:10)
summary汇总: (id:27 priority:10)
summary汇总: (id:28 priority:10)
summary汇总: (id:29 priority:10) summary汇总: (id:30 priority:0)
summary汇总: (id:31 priority:1)
summary汇总: (id:32 priority:2)
summary汇总: (id:33 priority:3)
summary汇总: (id:34 priority:4) summary汇总: (id:35 priority:5)
summary汇总: (id:36 priority:6)
summary汇总: (id:37 priority:7)
summary汇总: (id:38 priority:8)
summary汇总: (id:39 priority:9) summary汇总: (id:40 priority:-1) [-1 ] =Task >>id: 40 calling shutdownNow
完毕 prioritizedTaskConsumer
*/ /**
*与前一个演示样例同样,prioritizedTask对象的创建序列被记录在sequence list中,用于和实际的运行顺序比較。
*run()方法将休眠一小段随机的时间 ,然后打印对象信息,而EndSentinel提供了和前面同样的功能,
*要确保它是队列中最后一个对象。
*
*PrioritizedTaskProducer和PrioritizedTaskComsumer通过PriorityBlockingQueue彼此连接。
*由于这样的队列的堵塞特性提供了全部必需的同步。所以你应该注意到了,这里不须要不论什么显式的同步--不必考虑你从这样的队列中读取时
*,基中是否有无素,由于这个队列在没有元素时,将直接堵塞读取靠。 *
*
*/
版权声明:本文博主原创文章。博客,未经同意不得转载。
java PriorityBlockingQueue 基于优先级队列,的读出操作可以阻止.的更多相关文章
- java中PriorityQueue优先级队列使用方法
优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先 ...
- 《转》JAVA中PriorityQueue优先级队列使用方法
该文章转自:http://blog.csdn.net/hiphopmattshi/article/details/7334487 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最 ...
- 【转】java中PriorityQueue优先级队列使用方法
优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先 ...
- java 中PriorityQueue优先级队列使用方法
1.前言 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果想实现按照自己的意愿进行优 ...
- 什么是Java优先级队列?
PriorityQueue是基于无界优先级队列和优先级堆构建的重要Java API之一.本文通过适当的代码示例深入了解了有关此API及其用法的一些复杂信息.另在上篇文章中我们简单地谈了下Java编译器 ...
- 3. 基于优先级的Queue(PriorityBlockingQueue)
package com.gf.conn013; import java.util.Iterator; import java.util.concurrent.PriorityBlockingQueue ...
- java面向对象的栈 队列 优先级队列的比较
栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一 ...
- Java并发编程——阻塞队列BlockingQueue
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- 核心记账业务可用jdk7的PriorityBlockingQueue优先阻塞队列结合乐观锁实现
-- 1.优先级阻塞队列 当前核心记账业务是悲观锁实现,但考虑到高并发和死锁的问题,可以用PriorityBlockingQueue优先阻塞队列结合乐观锁实现,对于并发时出现锁无法update时可以重 ...
随机推荐
- Canvas之动态波浪效果_陈在真Sunny_chen_新浪博客
Canvas之动态波浪效果_陈在真Sunny_chen_新浪博客 Canvas之动态波浪效果 (2012-04-26 09:04:51) 转载▼
- Extjs实现进度条
做Extjs开发中,往往后台程序可能要执行一段时间才能得到返回结果,加入进度条可以提高客户体验度,以下为两种便捷的方式: 1.提交数据前用Ext.Msg.wait('提示','正在处理数据,请稍候') ...
- hdu 4619 Warm up 2 ( 二分图最大匹配 )
题目:Warm up 2 题意:有横竖两种方式放着的多米诺骨牌,相同方向的不可能重叠,但是横放和竖放 的牌可能重叠.移走重叠的牌使剩下的牌最多. 分析:二分图匹配:最大独立集= ...
- Python re模块 正则表达式
1 简介 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C ...
- mysql跟踪提交的SQL语句
http://www.cnblogs.com/wuyifu/p/3328024.html
- 解决安装Visual Studio 2012后SQL Server 2008 远程过程调用失败的问题
安装了Visual Studio 2012后,打开SQL Server 2008配置管理器,发现了一个问题.如下图 解决办法:
- Convert Sorted List to Binary Search Tree java
public TreeNode sortedListToBST(ListNode head) { if(head==null) return new TreeNode(0); ArrayList< ...
- java 包之 BeanUtils包的使用
BeanUtils工具包是由Apache公司所开发,主要是方便程序员对Bean类能够进行简便的操作. 在使用BeanUtils工具包之前我们需要的Jar包有以下几种: (1) BeanUtils相 ...
- go import
import "fmt"最常用的一种形式 import "./test"导入同一目录下test包中的内容 import f "fmt"导入f ...
- vi所有特殊字符
vi5个特殊字符包含 /.^.$.*.. 在vi中用/查找时,()不做为特殊字符处理 比如:查找字符串(cyg_uint8 *)b 应该这样写 /(cyg_uint8 \*)b 只有 * 需要转义 \ ...