package 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);
if(priority < o.priority)
{
return -1;
}else
{
if(priority > o.priority)
{
return 1;
}else
{
return 0;
}
}
}
@Override
public void run() {
//执行任务代码..
try {
TimeUnit.MILLISECONDS.sleep(rand.nextInt(250));
} catch (InterruptedException e) {
}
System.out.println(this);
}
@Override
public String toString() {
return String.format("[%1$-3d]", priority) + " Task id : " + id;
}
public String summary()
{
return "( Task id : " + id + " _priority : " + priority + ")";
}
/**
* 结束所有任务
*/
public static class EndSentinel extends PrioritizedTask
{
private ExecutorService exec;
public EndSentinel(ExecutorService e) {
super(Integer.MAX_VALUE);
exec = e;
}
public void run()
{
int count = 0;
for(PrioritizedTask pt : sequence)
{
System.out.print(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;
}
@Override
public void run() {
for(int i = 0; i < 20; i++)
{
queue.add(new PrioritizedTask(rand.nextInt(10)));
Thread.yield();
}
try {
for (int i = 0; i < 10; i++) {
TimeUnit.MILLISECONDS.sleep(250);
queue.add(new PrioritizedTask(10));
}
for(int i = 0; i < 10; i++)
{
queue.add(new PrioritizedTask(i));
}
queue.add(new PrioritizedTask.EndSentinel(exec));
} catch (InterruptedException e) {
}
System.out.println("Finished 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())
{
q.take().run();
}
} catch (InterruptedException e)
{
}
System.out.println("Finished PrioritizedTaskConsumer");
}
}
public class PriorityBlockingQueueDemo {
public static void main(String args[])
{
ExecutorService exec = Executors.newCachedThreadPool();
PriorityBlockingQueue<Runnable> queue = new PriorityBlockingQueue<Runnable>();
exec.execute(new PrioritizedTaskProducer(queue, exec));
try {
TimeUnit.MILLISECONDS.sleep(250);
} catch (InterruptedException e) {
}
exec.execute(new PrioritizedTaskConsumer(queue));
}
}
分享到:
相关推荐
线程池提交优先级,执行优先级
非常详细的java运算符优先级表,帮助记住优先级顺序
Java/Android优先级任务队列,适用于Java和Android开发人员,原理详解博客:http://blog.csdn.net/yanzhenjie1003/article/details/71773950
在任务执行期合理、科学地确定维修任务的优先级别...所建立的神经网络模型通过对输入与输出的训练,可以学习准则与维修任务优先级之间的复杂关系,获得并表示决策者的偏好,有效地辅助决策者对维修任务优先级进行分类。
java swing 计算器 优先级算法 漂亮的界面
java计算器含括号可进行优先级运算
java运算符与优先级,完善版本。 谢谢,
Java运算符+(优先级、目数)
java作业,可以实现括号的优先级判定以及输入错误时的纠错
* <p>Title: 提高线程优先级 * <p>Description: 通过修改线程的优先级,是线程获得优先处理。 * <p>Copyright: Copyright (c) 2003 * <p>Filename: upPRIThread.java * @author * @version 1.0
实时任务调度中基于任务的价值、剩余执行时间、空闲时间以及到述时同等多特征参数设计任务的优先级,并使任务的优先级随着任务紧迫性和完成程度变化而动态调整,并基于新的优先级设计策略提出一种实时动态抢占式调度...
OptimusAsyncTask 将每个任务抽象成 OptimusTask,OptimusTask 可以设置任务执行时间,任务优先级,获取任务状态等。 同时 OptimusAsyncTask 提供了 OptimusTask 的默认实现类 BaseOptimusTask,它实现了 Comparable...
实时系统;动态调度;调度策略;任务优先级;调度成功率
Nachos实现id、限制线程数和按优先级调度算法(增改源码) Nachos实现id、限制线程数和按优先级调度算法
中继卫星系统在天基信息网中起着桥梁的作用。...根据算法在仿真算例中的应用可见,相比对照算法,基于双层优先级的调度算法更有利于满足高价值、高紧迫性任务的执行条件,从而提高了任务成功率和调度综合收益。
A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调...
基于重复角色和任务优先级的访问控制模型,姜增虎,陈茂华,针对一个角色可以对应多个不同的任务,以及任务重要性的不同,在任务规则的基础上,提出了基于重复角色和任务优先级的访问控制模
AppExecutor 应用线程池,可以指定任务的优先级,以及任务执行顺序
多任务多线程管理模块,任务有优先级,一个任务执行完毕,按照优先级高低执行另一个任务 1)如何使用: 1. 声明一个HashTaskList,或在栈上动态获取; 2. 调用InitTaskList初始化上一步的HashTaskList 3. 调用...