您的位置:首页 > 产品设计 > UI/UE

Java并发编程-31-阻塞式优先级列表-PriorityBlockingQueue

2015-06-20 21:49 651 查看
一、PriorityBlockingQueue

1、PriorityBlockingQueue里面的元素必须实现Comparable接口

2、PriorityBlockingQueue,这个是阻塞式数据结构,当调用的方法不能立即执行时,调用这个方法的线程将被阻塞直到方法可以成功执行

3、提供的方法



二、测试

package concurrencycollection;

public class Event implements Comparable<Event> {

private int counterOfThread;
private int priority;

public Event(int counterOfThread, int priority) {
this.counterOfThread = counterOfThread;
this.priority = priority;
}

public int getCounterOfThread() {
return counterOfThread;
}

public int getPriority() {
return priority;
}

@Override
public int compareTo(Event o) {
// TODO Auto-generated method stub
if (this.getPriority() > o.getPriority()) {
return -1;
} else if (this.getPriority() < o.getPriority()) {
return 1;
}
return 0;
}

@Override
public String toString() {
return "Event [counterOfThread=" + counterOfThread + ", priority="
+ priority + "]";
}

}

package concurrencycollection;

import java.util.concurrent.PriorityBlockingQueue;

public class Task implements Runnable {

private int id;
private PriorityBlockingQueue<Event> priorityBlockingQueue;

public Task(int id, PriorityBlockingQueue<Event> priorityBlockingQueue) {
this.id = id;
this.priorityBlockingQueue = priorityBlockingQueue;
}

@Override
public void run() {
for (int i = 0; i < 1000; i++) {
Event event = new Event(id, i);
priorityBlockingQueue.add(event);
}
}
}

package concurrencycollection;

import java.util.concurrent.PriorityBlockingQueue;

public class Main2 {

public static void main(String[] args) {
PriorityBlockingQueue<Event> priorityBlockingQueue = new PriorityBlockingQueue<Event>();
Thread[] threads = new Thread[5];

for (int i = 0; i < threads.length; i++) {
Task task = new Task(i, priorityBlockingQueue);
threads[i] = new Thread(task);
}

for (int i = 0; i < threads.length; i++) {
threads[i].start();
}

for (int i = 0; i < threads.length; i++) {
try {
threads[i].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out
.println("Main : Queue size :" + priorityBlockingQueue.size());
for (int i = 0; i < threads.length * 1000; i++) {
Event event = priorityBlockingQueue.poll();
System.out.println(event);
}

System.out
.println("Main : Queue size :" + priorityBlockingQueue.size());
System.out.println("Main : End of the program\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: