PriorityBlockingQueue里面存储的对象必须是实现Comparable接口。队列通过这个接口的compare方法确定对象的priority。
规则是:当前和其他对象比较,如果compare方法返回负数,那么在队列里面的优先级就比较搞。
下面的测试可以说明这个断言:
查看打印结果,比较take出来的Entity和left的entity,比较他们的priority
public class TestPriorityQueue {
static Random r=new Random(47);
public static void main(String args[]){
final PriorityBlockingQueue q=new PriorityBlockingQueue();
ExecutorService se=Executors.newCachedThreadPool();
//execute producer
se.execute(new Runnable(){
public void run() {
int i=0;
while(true){
q.put(new PriorityEntity(r.nextInt(10),i++));
try {
TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
//execute consumer
se.execute(new Runnable(){
public void run() {
while(true){
try {
out.println("take-- "+q.take()+" left:-- ["+q.toString()+"]");
try {
TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.println("shutdown");
}
}
class PriorityEntity implements Comparable<PriorityEntity> {
private static int count=0;
private int id=count++;
private int priority;
private int index=0;
public PriorityEntity(int _priority,int _index) {
this.priority = _priority;
this.index=_index;
}
public String toString(){
return id+"# [index="+index+" priority="+priority+"]";
}
//数字小,优先级高
public int compareTo(PriorityEntity o) {
return this.priority > o.priority ? 1
: this.priority < o.priority ? -1 : 0;
}
//数字大,优先级高
// public int compareTo(PriorityTask o) {
// return this.priority < o.priority ? 1
// : this.priority > o.priority ? -1 : 0;
// }
}
分享到:
相关推荐
5. **优先级规则** - 自然顺序:如果元素实现了Comparable接口,队列会根据元素的compareTo方法来确定优先级。 - 自定义比较器:如果不满足自然顺序,可以通过构造函数传递Comparator来定义优先级。 6. **线程...
PriorityBlockingQueue不会保证线程公平性,但是它能保证元素的出队顺序遵循优先级规则,这在需要执行优先级任务的场景下非常有用。 这些阻塞队列都实现了java.util.concurrent.BlockingQueue接口,提供了如put、...
2. **比较规则**:队列中的元素必须实现Comparable接口,或者在创建队列时提供Comparator,以便进行排序。如果元素不可比较,PriorityQueue将无法正常工作。 3. **大小**:PriorityQueue的大小是无限制的,但可以在...
### Java中的PriorityQueue详解 ...`PriorityQueue`在Java中是一种非常实用的数据结构,特别是在需要按照一定规则对数据进行排序的情况下。通过对它的深入理解,开发者可以更好地利用这一工具来优化自己的应用程序。
通过学习Quartz.NET的源码,我们可以理解其内部调度算法,如PriorityBlockingQueue在处理并发和优先级方面的实现,以及如何通过ThreadPool或线程池进行任务调度。同时,这也有助于我们更好地调试和优化自己的任务...
3. PriorityBlockingQueue:支持优先级排序的无界阻塞队列,元素按照自然顺序或自定义比较器进行排序。 4. DelayQueue:无界阻塞队列,元素需具有延迟时间,只有在延迟时间到达后才能被获取。 5. SynchronousQueue:...
PriorityQueue和PriorityBlockingQueue是两个基于优先级的队列实现,它们允许元素按照自然顺序或其他自定义优先级顺序进行排序和访问。SynchronousQueue是一种特殊的队列实现,它不存储元素,而是用于线程间的直接...
它们各有特点,如`ArrayBlockingQueue`的容量固定,`LinkedBlockingQueue`的容量可变但默认无限,`PriorityBlockingQueue`则能保持元素的优先级。 3. **生产者线程**:生产者线程负责向队列中添加元素。在Java中,...
3. **优先级队列**:为了更高效地调度任务,我们可以使用优先级队列(PriorityBlockingQueue)存储待执行的任务。这样,高优先级的任务会被优先执行,提高了系统的响应速度。 4. **Future和Callable接口**:这些...
PriorityBlockingQueue则支持优先级的设置,可以按优先级顺序执行任务。 饱和策略决定了当线程池无法接受新任务时的行为。默认的AbortPolicy会抛出异常,DiscardPolicy会直接丢弃任务,CallerRunsPolicy则由提交...
- **PriorityBlockingQueue**: 一种可以按照元素的优先级排序的`BlockingQueue`,可以通过提供`Comparator`来定制排序规则。 - **SynchronousQueue**: 特殊的`BlockingQueue`,要求对它的操作必须是交替进行的,即一...
- 规定了程序中的各种变量(线程共享变量)的访问规则。 - 描述了主内存与线程工作内存之间的交互协议。 - **主要特性**: - 原子性、可见性和有序性。 - 保证了线程间数据的一致性。 #### 十四、线程池的种类 ...
│ 高并发编程第一阶段13讲、线程ID,优先级讲解.mp4 │ 高并发编程第一阶段14讲、Thread的join方法详细介绍,结合一个典型案例.mp4 │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发...
│ 高并发编程第一阶段13讲、线程ID,优先级讲解.mp4 │ 高并发编程第一阶段14讲、Thread的join方法详细介绍,结合一个典型案例.mp4 │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发...