一、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"); } }