生产消费者4 - 实现一个基于优先级的传输队列【消费顺序是由优先级决定的而不是抵达时间】

时间:2022-06-16 17:24:14

实现一个基于优先级的传输队列

Java 7 API 提供几种与并发应用相关的数据类型。从这里面,我们想来重点介绍以下2种数据类型:

  • LinkedTransferQueue:这个数据类型支持那些有生产者和消费者结构的程序。 在那些应用,你有一个或者多个数据生产者,一个或多个数据消费者和一个被生产者和消费者共享的数据类型。生产者把数据放入数据结构内,然后消费者从数据结构内提取数据。如果数据结构为空,消费者会被阻塞直到有数据可以消费。如果数据结构满了,生产者就会被阻塞直到有空位来放数据。

  • PriorityBlockingQueue:在这个数据结构,元素是按照顺序储存的。元素们必须实现 带有 compareTo() 方法的 Comparable 接口。当你在结构中插入数据时,它会与数据元素对比直到找到它的位置。

LinkedTransferQueue 的元素是按照抵达顺序储存的,所以越早到的越先被消耗。你有可能需要开发 producer/ consumer 程序,它的消耗顺序是由优先级决定的而不是抵达时间。在这个指南,你将学习如何实现在 producer/ consumer 问题中使用的数据结构,这些元素将被按照他们的优先级排序,级别高的会先被消耗。

实例代码

package com.packtpub.java7.concurrency.chapter7.recipe09.core;

import java.util.concurrent.TimeUnit;

import com.packtpub.java7.concurrency.chapter7.recipe09.task.Consumer;
import com.packtpub.java7.concurrency.chapter7.recipe09.task.Event;
import com.packtpub.java7.concurrency.chapter7.recipe09.task.MyPriorityTransferQueue;
import com.packtpub.java7.concurrency.chapter7.recipe09.task.Producer;

/**
* Main class of the example.
*
*/

public class Main {

/**
* @param args
*/

public static void main(String[] args) throws Exception{

/*
* Create a Prioriy Transfer Queue
*/

MyPriorityTransferQueue<Event> buffer=new MyPriorityTransferQueue<>();

/*
* Create a Producer object
*/

Producer producer=new Producer(buffer);

/*
* Launch 10 producers
*/

Thread producerThreads[]=new Thread[10];
for (int i=0; i<producerThreads.length; i++) {
producerThreads[i]=new Thread(producer);
producerThreads[i].start();
}

/*
* Create and launch the consumer
*/

Consumer consumer=new Consumer(buffer);
Thread consumerThread=new Thread(consumer);
consumerThread.start();

/*
* Write in the console the actual consumer count
*/

System.out.printf("Main: Buffer: Consumer count: %d\n",buffer.getWaitingConsumerCount());

/*
* Transfer an event to the consumer
*/

Event myEvent=new Event("Core Event",0);
buffer.transfer(myEvent);
System.out.printf("Main: My Event has ben transfered.\n");

/*
* Wait for the finalization of the producers
*/

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

/*
* Sleep the thread for one second
*/

TimeUnit.SECONDS.sleep(1);

/*
* Write the actual consumer count
*/

System.out.printf("Main: Buffer: Consumer count: %d\n",buffer.getWaitingConsumerCount());

/*
* Transfer another event
*/

myEvent=new Event("Core Event 2",0);
buffer.transfer(myEvent);

/*
* Wait for the finalization of the consumer
*/

consumerThread.join();

/*
* Write a message indicating the end of the program
*/

System.out.printf("Main: End of the program\n");
}

}
package com.packtpub.java7.concurrency.chapter7.recipe09.task;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TransferQueue;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

/**
* This class implements a priority based transfer queue. It extends the
* PriorityBlockingQueue class and implements the TransferQueue interface
*
* @param <E> Class of the elements to be stored in the queue
*/

public class MyPriorityTransferQueue<E> extends PriorityBlockingQueue<E> implements
TransferQueue<E> {

/**
* Serial Version of the class
*/

private static final long serialVersionUID = 1L;

/**
* Number of consumers waiting
*/

private AtomicInteger counter;

/**
* Blocking queue to store the transfered elements
*/

private LinkedBlockingQueue<E> transfered;

/**
* Lock to control the acces to the operations
*/

private ReentrantLock lock;

/**
* Constructor of the class
*/

public MyPriorityTransferQueue() {
counter=new AtomicInteger(0);
lock=new ReentrantLock();
transfered=new LinkedBlockingQueue<>();
}

/**
* This method tries to transfer an element to a consumer. If there is
* a consumer waiting, we puts the element in the queue and return the
* true value. Else, return the false value.
*/

@Override
public boolean tryTransfer(E e) {
lock.lock();
boolean value;
if (counter.get()==0) {
value=false;
} else {
put(e);
value=true;
}
lock.unlock();
return value;
}

/**
* Transfer an element to the consumer. If there is a consumer waiting,
* puts the element on the queue and return the true value. Else, puts the
* value in the transfered queue and returns the false value. In this case, the
* thread than makes the call will be blocked until a consumer takes the transfered
* elements
*/

@Override
public void transfer(E e) throws InterruptedException {
lock.lock();
if (counter.get()!=0) {
put(e);
lock.unlock();
} else {
transfered.add(e);
lock.unlock();
synchronized (e) {
e.wait();
}
}
}

/**
* This method tries to transfer an element to a consumer waiting a maximum period
* of time. If there is a consumer waiting, puts the element in the queue. Else,
* puts the element in the queue of transfered elements and wait the specified period of time
* until that time pass or the thread is interrupted.
*/

@Override
public boolean tryTransfer(E e, long timeout, TimeUnit unit)
throws InterruptedException {
lock.lock();
if (counter.get()!=0) {
put(e);
lock.unlock();
return true;
} else {
transfered.add(e);
long newTimeout=TimeUnit.MILLISECONDS.convert(timeout, unit);
lock.unlock();
e.wait(newTimeout);
lock.lock();
if (transfered.contains(e)) {
transfered.remove(e);
lock.unlock();
return false;
} else {
lock.unlock();
return true;
}
}
}


/**
* Method that returns if the queue has waiting consumers
*/

@Override
public boolean hasWaitingConsumer() {
return (counter.get()!=0);
}

/**
* Method that returns the number of waiting consumers
*/

@Override
public int getWaitingConsumerCount() {
return counter.get();
}

/**
* Method that returns the first element of the queue or is blocked if the queue
* is empty. If there is transfered elements, takes the first transfered element and
* wake up the thread that is waiting for the transfer of that element. Else, takes the
* first element of the queue or is blocked until there is one element in the queue.
*/

@Override
public E take() throws InterruptedException {
lock.lock();
counter.incrementAndGet();
E value=transfered.poll();
if (value==null) {
lock.unlock();
value=super.take();
lock.lock();
} else {
synchronized (value) {
value.notify();
}
}
counter.decrementAndGet();
lock.unlock();
return value;
}
}
package com.packtpub.java7.concurrency.chapter7.recipe09.task;

/**
* This class implements the producers of data. It store 100
* events in the queue with incremental priority
*
*/

public class Producer implements Runnable {

/**
* Buffer used to store the events
*/

private MyPriorityTransferQueue<Event> buffer;

/**
* Constructor of the class. It initializes its parameters
* @param buffer Buffer to store the events
*/

public Producer(MyPriorityTransferQueue<Event> buffer) {
this.buffer=buffer;
}

/**
* Main method of the producer. Store 100 events in the buffer with
* incremental priority
*/

@Override
public void run() {
for (int i=0; i<100; i++) {
Event event=new Event(Thread.currentThread().getName(),i);
buffer.put(event);
}
}

}
package com.packtpub.java7.concurrency.chapter7.recipe09.task;

/**
* This class implements the Consumer of the events. There is only
* one consumer in the example that consumes 1002 events
*
*/

public class Consumer implements Runnable {

/**
* Buffer from which the consumer takes the events
*/

private MyPriorityTransferQueue<Event> buffer;

/**
* Constructor of the class. Initializes its attributes
* @param buffer Buffer from which the consumer takes the events
*/

public Consumer(MyPriorityTransferQueue<Event> buffer) {
this.buffer=buffer;
}

/**
* Main method of the consumer. It takes 1002 events from the buffer
*/

@Override
public void run() {
for (int i=0; i<1002; i++) {
try {
Event value=buffer.take();
System.out.printf("Consumer: %s: %d\n",value.getThread(),value.getPriority());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}

结果

例子的主类创建了一个 MyPriorityTransferQueue 对象,10个生产者,和一个消费者,然后使用MyPriorityTransferQueue buffer 的 transfer() 方法来传输2个事件到 buffer。

你可以发现有着高级别的事件如何先被消费,和一个消费者如何消费传输的事件。

Main: Buffer: Consumer count: 0
Consumer: Thread-7: 99
Consumer: Core Event: 0
Consumer: Thread-5: 99
Consumer: Thread-8: 99
Consumer: Thread-0: 99
Consumer: Thread-9: 99
Consumer: Thread-2: 99
Consumer: Thread-1: 99
Consumer: Thread-4: 99
Consumer: Thread-3: 99
Consumer: Thread-6: 99
Consumer: Thread-7: 98
Consumer: Thread-8: 98
Consumer: Thread-5: 98
Consumer: Thread-0: 98
Consumer: Thread-2: 98
Consumer: Thread-9: 98
Consumer: Thread-1: 98
Consumer: Thread-4: 98
Main: My Event has ben transfered.
Consumer: Thread-3: 98
Consumer: Thread-6: 98
Consumer: Thread-7: 97
Consumer: Thread-5: 97
Consumer: Thread-8: 97
Consumer: Thread-0: 97
Consumer: Thread-9: 97
Consumer: Thread-2: 97
Consumer: Thread-1: 97
Consumer: Thread-4: 97
Consumer: Thread-3: 97
Consumer: Thread-6: 97
Consumer: Thread-7: 96
Consumer: Thread-5: 96
Consumer: Thread-8: 96
Consumer: Thread-0: 96
Consumer: Thread-9: 96
Consumer: Thread-2: 96
Consumer: Thread-1: 96
Consumer: Thread-4: 96
Consumer: Thread-3: 96
Consumer: Thread-6: 96
Consumer: Thread-7: 95
Consumer: Thread-5: 95
Consumer: Thread-8: 95
Consumer: Thread-0: 95
Consumer: Thread-9: 95
Consumer: Thread-2: 95
Consumer: Thread-1: 95
Consumer: Thread-4: 95
Consumer: Thread-3: 95
Consumer: Thread-6: 95
Consumer: Thread-5: 94
Consumer: Thread-7: 94
Consumer: Thread-6: 94
Consumer: Thread-8: 94
Consumer: Thread-0: 94
Consumer: Thread-9: 94
Consumer: Thread-2: 94
Consumer: Thread-1: 94
Consumer: Thread-4: 94
Consumer: Thread-3: 94
Consumer: Thread-7: 93
Consumer: Thread-5: 93
Consumer: Thread-8: 93
Consumer: Thread-0: 93
Consumer: Thread-9: 93
Consumer: Thread-2: 93
Consumer: Thread-1: 93
Consumer: Thread-4: 93
Consumer: Thread-3: 93
Consumer: Thread-6: 93
Consumer: Thread-5: 92
Consumer: Thread-7: 92
Consumer: Thread-8: 92
Consumer: Thread-0: 92
Consumer: Thread-9: 92
Consumer: Thread-2: 92
Consumer: Thread-1: 92
Consumer: Thread-4: 92
Consumer: Thread-3: 92
Consumer: Thread-6: 92
Consumer: Thread-5: 91
Consumer: Thread-7: 91
Consumer: Thread-8: 91
Consumer: Thread-0: 91
Consumer: Thread-9: 91
Consumer: Thread-2: 91
Consumer: Thread-1: 91
Consumer: Thread-4: 91
Consumer: Thread-3: 91
Consumer: Thread-6: 91
Consumer: Thread-5: 90
Consumer: Thread-7: 90
Consumer: Thread-8: 90
Consumer: Thread-0: 90
Consumer: Thread-9: 90
Consumer: Thread-2: 90
Consumer: Thread-1: 90
Consumer: Thread-4: 90
Consumer: Thread-3: 90
Consumer: Thread-6: 90
Consumer: Thread-5: 89
Consumer: Thread-0: 89
Consumer: Thread-7: 89
Consumer: Thread-8: 89
Consumer: Thread-9: 89
Consumer: Thread-2: 89
Consumer: Thread-1: 89
Consumer: Thread-4: 89
Consumer: Thread-3: 89
Consumer: Thread-6: 89
Consumer: Thread-5: 88
Consumer: Thread-0: 88
Consumer: Thread-7: 88
Consumer: Thread-8: 88
Consumer: Thread-6: 88
Consumer: Thread-9: 88
Consumer: Thread-2: 88
Consumer: Thread-1: 88
Consumer: Thread-4: 88
Consumer: Thread-3: 88
Consumer: Thread-5: 87
Consumer: Thread-0: 87
Consumer: Thread-7: 87
Consumer: Thread-8: 87
Consumer: Thread-9: 87
Consumer: Thread-2: 87
Consumer: Thread-1: 87
Consumer: Thread-4: 87
Consumer: Thread-6: 87
Consumer: Thread-3: 87
Consumer: Thread-5: 86
Consumer: Thread-0: 86
Consumer: Thread-7: 86
Consumer: Thread-8: 86
Consumer: Thread-9: 86
Consumer: Thread-2: 86
Consumer: Thread-1: 86
Consumer: Thread-4: 86
Consumer: Thread-3: 86
Consumer: Thread-6: 86
Consumer: Thread-5: 85
Consumer: Thread-0: 85
Consumer: Thread-7: 85
Consumer: Thread-8: 85
Consumer: Thread-9: 85
Consumer: Thread-2: 85
Consumer: Thread-1: 85
Consumer: Thread-4: 85
Consumer: Thread-3: 85
Consumer: Thread-6: 85
Consumer: Thread-5: 84
Consumer: Thread-0: 84
Consumer: Thread-2: 84
Consumer: Thread-7: 84
Consumer: Thread-8: 84
Consumer: Thread-9: 84
Consumer: Thread-1: 84
Consumer: Thread-6: 84
Consumer: Thread-4: 84
Consumer: Thread-3: 84
Consumer: Thread-7: 83
Consumer: Thread-5: 83
Consumer: Thread-0: 83
Consumer: Thread-2: 83
Consumer: Thread-8: 83
Consumer: Thread-9: 83
Consumer: Thread-1: 83
Consumer: Thread-4: 83
Consumer: Thread-6: 83
Consumer: Thread-3: 83
Consumer: Thread-0: 82
Consumer: Thread-7: 82
Consumer: Thread-5: 82
Consumer: Thread-2: 82
Consumer: Thread-1: 82
Consumer: Thread-8: 82
Consumer: Thread-9: 82
Consumer: Thread-4: 82
Consumer: Thread-3: 82
Consumer: Thread-6: 82
Consumer: Thread-0: 81
Consumer: Thread-5: 81
Consumer: Thread-7: 81
Consumer: Thread-2: 81
Consumer: Thread-1: 81
Consumer: Thread-8: 81
Consumer: Thread-9: 81
Consumer: Thread-4: 81
Consumer: Thread-3: 81
Consumer: Thread-6: 81
Consumer: Thread-0: 80
Consumer: Thread-5: 80
Consumer: Thread-2: 80
Consumer: Thread-7: 80
Consumer: Thread-1: 80
Consumer: Thread-8: 80
Consumer: Thread-9: 80
Consumer: Thread-4: 80
Consumer: Thread-3: 80
Consumer: Thread-6: 80
Consumer: Thread-0: 79
Consumer: Thread-5: 79
Consumer: Thread-2: 79
Consumer: Thread-7: 79
Consumer: Thread-1: 79
Consumer: Thread-8: 79
Consumer: Thread-6: 79
Consumer: Thread-9: 79
Consumer: Thread-4: 79
Consumer: Thread-3: 79
Consumer: Thread-0: 78
Consumer: Thread-2: 78
Consumer: Thread-5: 78
Consumer: Thread-7: 78
Consumer: Thread-1: 78
Consumer: Thread-4: 78
Consumer: Thread-8: 78
Consumer: Thread-9: 78
Consumer: Thread-3: 78
Consumer: Thread-6: 78
Consumer: Thread-0: 77
Consumer: Thread-5: 77
Consumer: Thread-7: 77
Consumer: Thread-1: 77
Consumer: Thread-8: 77
Consumer: Thread-2: 77
Consumer: Thread-9: 77
Consumer: Thread-4: 77
Consumer: Thread-3: 77
Consumer: Thread-6: 77
Consumer: Thread-0: 76
Consumer: Thread-5: 76
Consumer: Thread-7: 76
Consumer: Thread-1: 76
Consumer: Thread-8: 76
Consumer: Thread-9: 76
Consumer: Thread-2: 76
Consumer: Thread-4: 76
Consumer: Thread-3: 76
Consumer: Thread-6: 76
Consumer: Thread-0: 75
Consumer: Thread-5: 75
Consumer: Thread-7: 75
Consumer: Thread-1: 75
Consumer: Thread-8: 75
Consumer: Thread-9: 75
Consumer: Thread-2: 75
Consumer: Thread-4: 75
Consumer: Thread-3: 75
Consumer: Thread-6: 75
Consumer: Thread-0: 74
Consumer: Thread-5: 74
Consumer: Thread-7: 74
Consumer: Thread-1: 74
Consumer: Thread-8: 74
Consumer: Thread-9: 74
Consumer: Thread-4: 74
Consumer: Thread-3: 74
Consumer: Thread-2: 74
Consumer: Thread-6: 74
Consumer: Thread-0: 73
Consumer: Thread-5: 73
Consumer: Thread-7: 73
Consumer: Thread-1: 73
Consumer: Thread-8: 73
Consumer: Thread-9: 73
Consumer: Thread-4: 73
Consumer: Thread-3: 73
Consumer: Thread-6: 73
Consumer: Thread-2: 73
Consumer: Thread-0: 72
Consumer: Thread-5: 72
Consumer: Thread-7: 72
Consumer: Thread-1: 72
Consumer: Thread-8: 72
Consumer: Thread-6: 72
Consumer: Thread-9: 72
Consumer: Thread-2: 72
Consumer: Thread-4: 72
Consumer: Thread-3: 72
Consumer: Thread-0: 71
Consumer: Thread-7: 71
Consumer: Thread-1: 71
Consumer: Thread-8: 71
Consumer: Thread-2: 71
Consumer: Thread-3: 71
Consumer: Thread-9: 71
Consumer: Thread-4: 71
Consumer: Thread-6: 71
Consumer: Thread-5: 71
Consumer: Thread-0: 70
Consumer: Thread-7: 70
Consumer: Thread-1: 70
Consumer: Thread-8: 70
Consumer: Thread-2: 70
Consumer: Thread-9: 70
Consumer: Thread-4: 70
Consumer: Thread-3: 70
Consumer: Thread-6: 70
Consumer: Thread-5: 70
Consumer: Thread-0: 69
Consumer: Thread-7: 69
Consumer: Thread-1: 69
Consumer: Thread-8: 69
Consumer: Thread-2: 69
Consumer: Thread-9: 69
Consumer: Thread-4: 69
Consumer: Thread-3: 69
Consumer: Thread-6: 69
Consumer: Thread-5: 69
Consumer: Thread-0: 68
Consumer: Thread-7: 68
Consumer: Thread-2: 68
Consumer: Thread-1: 68
Consumer: Thread-8: 68
Consumer: Thread-4: 68
Consumer: Thread-5: 68
Consumer: Thread-9: 68
Consumer: Thread-6: 68
Consumer: Thread-3: 68
Consumer: Thread-0: 67
Consumer: Thread-1: 67
Consumer: Thread-7: 67
Consumer: Thread-2: 67
Consumer: Thread-8: 67
Consumer: Thread-9: 67
Consumer: Thread-5: 67
Consumer: Thread-4: 67
Consumer: Thread-3: 67
Consumer: Thread-6: 67
Consumer: Thread-0: 66
Consumer: Thread-1: 66
Consumer: Thread-2: 66
Consumer: Thread-7: 66
Consumer: Thread-8: 66
Consumer: Thread-9: 66
Consumer: Thread-5: 66
Consumer: Thread-4: 66
Consumer: Thread-3: 66
Consumer: Thread-6: 66
Consumer: Thread-0: 65
Consumer: Thread-1: 65
Consumer: Thread-2: 65
Consumer: Thread-7: 65
Consumer: Thread-6: 65
Consumer: Thread-8: 65
Consumer: Thread-9: 65
Consumer: Thread-5: 65
Consumer: Thread-4: 65
Consumer: Thread-3: 65
Consumer: Thread-0: 64
Consumer: Thread-1: 64
Consumer: Thread-7: 64
Consumer: Thread-2: 64
Consumer: Thread-8: 64
Consumer: Thread-9: 64
Consumer: Thread-5: 64
Consumer: Thread-4: 64
Consumer: Thread-3: 64
Consumer: Thread-6: 64
Consumer: Thread-0: 63
Consumer: Thread-1: 63
Consumer: Thread-2: 63
Consumer: Thread-7: 63
Consumer: Thread-8: 63
Consumer: Thread-9: 63
Consumer: Thread-4: 63
Consumer: Thread-3: 63
Consumer: Thread-6: 63
Consumer: Thread-5: 63
Consumer: Thread-0: 62
Consumer: Thread-4: 62
Consumer: Thread-2: 62
Consumer: Thread-7: 62
Consumer: Thread-8: 62
Consumer: Thread-9: 62
Consumer: Thread-3: 62
Consumer: Thread-5: 62
Consumer: Thread-6: 62
Consumer: Thread-1: 62
Consumer: Thread-2: 61
Consumer: Thread-0: 61
Consumer: Thread-7: 61
Consumer: Thread-8: 61
Consumer: Thread-9: 61
Consumer: Thread-4: 61
Consumer: Thread-3: 61
Consumer: Thread-6: 61
Consumer: Thread-5: 61
Consumer: Thread-1: 61
Consumer: Thread-0: 60
Consumer: Thread-2: 60
Consumer: Thread-7: 60
Consumer: Thread-8: 60
Consumer: Thread-9: 60
Consumer: Thread-4: 60
Consumer: Thread-3: 60
Consumer: Thread-6: 60
Consumer: Thread-5: 60
Consumer: Thread-1: 60
Consumer: Thread-0: 59
Consumer: Thread-2: 59
Consumer: Thread-7: 59
Consumer: Thread-4: 59
Consumer: Thread-9: 59
Consumer: Thread-3: 59
Consumer: Thread-1: 59
Consumer: Thread-8: 59
Consumer: Thread-6: 59
Consumer: Thread-5: 59
Consumer: Thread-0: 58
Consumer: Thread-2: 58
Consumer: Thread-7: 58
Consumer: Thread-4: 58
Consumer: Thread-5: 58
Consumer: Thread-8: 58
Consumer: Thread-9: 58
Consumer: Thread-3: 58
Consumer: Thread-6: 58
Consumer: Thread-1: 58
Consumer: Thread-0: 57
Consumer: Thread-2: 57
Consumer: Thread-7: 57
Consumer: Thread-4: 57
Consumer: Thread-8: 57
Consumer: Thread-9: 57
Consumer: Thread-5: 57
Consumer: Thread-1: 57
Consumer: Thread-3: 57
Consumer: Thread-6: 57
Consumer: Thread-0: 56
Consumer: Thread-2: 56
Consumer: Thread-7: 56
Consumer: Thread-3: 56
Consumer: Thread-4: 56
Consumer: Thread-8: 56
Consumer: Thread-1: 56
Consumer: Thread-9: 56
Consumer: Thread-5: 56
Consumer: Thread-6: 56
Consumer: Thread-0: 55
Consumer: Thread-2: 55
Consumer: Thread-7: 55
Consumer: Thread-4: 55
Consumer: Thread-8: 55
Consumer: Thread-9: 55
Consumer: Thread-3: 55
Consumer: Thread-5: 55
Consumer: Thread-1: 55
Consumer: Thread-6: 55
Consumer: Thread-0: 54
Consumer: Thread-2: 54
Consumer: Thread-7: 54
Consumer: Thread-1: 54
Consumer: Thread-6: 54
Consumer: Thread-4: 54
Consumer: Thread-8: 54
Consumer: Thread-9: 54
Consumer: Thread-3: 54
Consumer: Thread-5: 54
Consumer: Thread-0: 53
Consumer: Thread-2: 53
Consumer: Thread-7: 53
Consumer: Thread-4: 53
Consumer: Thread-9: 53
Consumer: Thread-3: 53
Consumer: Thread-8: 53
Consumer: Thread-5: 53
Consumer: Thread-6: 53
Consumer: Thread-1: 53
Consumer: Thread-0: 52
Consumer: Thread-2: 52
Consumer: Thread-7: 52
Consumer: Thread-4: 52
Consumer: Thread-3: 52
Consumer: Thread-8: 52
Consumer: Thread-9: 52
Consumer: Thread-6: 52
Consumer: Thread-5: 52
Consumer: Thread-1: 52
Consumer: Thread-0: 51
Consumer: Thread-2: 51
Consumer: Thread-7: 51
Consumer: Thread-8: 51
Consumer: Thread-3: 51
Consumer: Thread-9: 51
Consumer: Thread-6: 51
Consumer: Thread-5: 51
Consumer: Thread-1: 51
Consumer: Thread-4: 51
Consumer: Thread-0: 50
Consumer: Thread-2: 50
Consumer: Thread-7: 50
Consumer: Thread-3: 50
Consumer: Thread-4: 50
Consumer: Thread-1: 50
Consumer: Thread-8: 50
Consumer: Thread-9: 50
Consumer: Thread-5: 50
Consumer: Thread-6: 50
Consumer: Thread-0: 49
Consumer: Thread-2: 49
Consumer: Thread-7: 49
Consumer: Thread-3: 49
Consumer: Thread-9: 49
Consumer: Thread-4: 49
Consumer: Thread-8: 49
Consumer: Thread-1: 49
Consumer: Thread-6: 49
Consumer: Thread-5: 49
Consumer: Thread-0: 48
Consumer: Thread-2: 48
Consumer: Thread-7: 48
Consumer: Thread-3: 48
Consumer: Thread-9: 48
Consumer: Thread-4: 48
Consumer: Thread-8: 48
Consumer: Thread-6: 48
Consumer: Thread-5: 48
Consumer: Thread-1: 48
Consumer: Thread-4: 47
Consumer: Thread-7: 47
Consumer: Thread-3: 47
Consumer: Thread-9: 47
Consumer: Thread-0: 47
Consumer: Thread-2: 47
Consumer: Thread-5: 47
Consumer: Thread-6: 47
Consumer: Thread-1: 47
Consumer: Thread-8: 47
Consumer: Thread-7: 46
Consumer: Thread-9: 46
Consumer: Thread-1: 46
Consumer: Thread-4: 46
Consumer: Thread-5: 46
Consumer: Thread-8: 46
Consumer: Thread-2: 46
Consumer: Thread-6: 46
Consumer: Thread-0: 46
Consumer: Thread-3: 46
Consumer: Thread-7: 45
Consumer: Thread-9: 45
Consumer: Thread-5: 45
Consumer: Thread-4: 45
Consumer: Thread-8: 45
Consumer: Thread-0: 45
Consumer: Thread-1: 45
Consumer: Thread-6: 45
Consumer: Thread-2: 45
Consumer: Thread-3: 45
Consumer: Thread-7: 44
Consumer: Thread-8: 44
Consumer: Thread-4: 44
Consumer: Thread-5: 44
Consumer: Thread-3: 44
Consumer: Thread-9: 44
Consumer: Thread-2: 44
Consumer: Thread-0: 44
Consumer: Thread-6: 44
Consumer: Thread-1: 44
Consumer: Thread-8: 43
Consumer: Thread-7: 43
Consumer: Thread-9: 43
Consumer: Thread-0: 43
Consumer: Thread-4: 43
Consumer: Thread-1: 43
Consumer: Thread-6: 43
Consumer: Thread-3: 43
Consumer: Thread-5: 43
Consumer: Thread-2: 43
Consumer: Thread-7: 42
Consumer: Thread-4: 42
Consumer: Thread-3: 42
Consumer: Thread-0: 42
Consumer: Thread-8: 42
Consumer: Thread-9: 42
Consumer: Thread-5: 42
Consumer: Thread-1: 42
Consumer: Thread-6: 42
Consumer: Thread-2: 42
Consumer: Thread-7: 41
Consumer: Thread-4: 41
Consumer: Thread-8: 41
Consumer: Thread-1: 41
Consumer: Thread-5: 41
Consumer: Thread-0: 41
Consumer: Thread-9: 41
Consumer: Thread-6: 41
Consumer: Thread-3: 41
Consumer: Thread-2: 41
Consumer: Thread-7: 40
Consumer: Thread-1: 40
Consumer: Thread-4: 40
Consumer: Thread-8: 40
Consumer: Thread-2: 40
Consumer: Thread-5: 40
Consumer: Thread-0: 40
Consumer: Thread-6: 40
Consumer: Thread-9: 40
Consumer: Thread-3: 40
Consumer: Thread-7: 39
Consumer: Thread-9: 39
Consumer: Thread-6: 39
Consumer: Thread-4: 39
Consumer: Thread-8: 39
Consumer: Thread-3: 39
Consumer: Thread-5: 39
Consumer: Thread-0: 39
Consumer: Thread-1: 39
Consumer: Thread-2: 39
Consumer: Thread-7: 38
Consumer: Thread-8: 38
Consumer: Thread-5: 38
Consumer: Thread-9: 38
Consumer: Thread-2: 38
Consumer: Thread-3: 38
Consumer: Thread-0: 38
Consumer: Thread-1: 38
Consumer: Thread-6: 38
Consumer: Thread-4: 38
Consumer: Thread-7: 37
Consumer: Thread-9: 37
Consumer: Thread-2: 37
Consumer: Thread-5: 37
Consumer: Thread-1: 37
Consumer: Thread-8: 37
Consumer: Thread-6: 37
Consumer: Thread-4: 37
Consumer: Thread-0: 37
Consumer: Thread-3: 37
Consumer: Thread-7: 36
Consumer: Thread-9: 36
Consumer: Thread-6: 36
Consumer: Thread-8: 36
Consumer: Thread-1: 36
Consumer: Thread-3: 36
Consumer: Thread-5: 36
Consumer: Thread-0: 36
Consumer: Thread-4: 36
Consumer: Thread-2: 36
Consumer: Thread-7: 35
Consumer: Thread-2: 35
Consumer: Thread-0: 35
Consumer: Thread-9: 35
Consumer: Thread-1: 35
Consumer: Thread-6: 35
Consumer: Thread-8: 35
Consumer: Thread-5: 35
Consumer: Thread-4: 35
Consumer: Thread-3: 35
Consumer: Thread-9: 34
Consumer: Thread-7: 34
Consumer: Thread-4: 34
Consumer: Thread-8: 34
Consumer: Thread-2: 34
Consumer: Thread-1: 34
Consumer: Thread-0: 34
Consumer: Thread-5: 34
Consumer: Thread-6: 34
Consumer: Thread-3: 34
Consumer: Thread-3: 33
Consumer: Thread-7: 33
Consumer: Thread-2: 33
Consumer: Thread-0: 33
Consumer: Thread-8: 33
Consumer: Thread-6: 33
Consumer: Thread-5: 33
Consumer: Thread-9: 33
Consumer: Thread-1: 33
Consumer: Thread-4: 33
Consumer: Thread-8: 32
Consumer: Thread-7: 32
Consumer: Thread-0: 32
Consumer: Thread-2: 32
Consumer: Thread-5: 32
Consumer: Thread-3: 32
Consumer: Thread-9: 32
Consumer: Thread-6: 32
Consumer: Thread-4: 32
Consumer: Thread-1: 32
Consumer: Thread-0: 31
Consumer: Thread-7: 31
Consumer: Thread-9: 31
Consumer: Thread-8: 31
Consumer: Thread-1: 31
Consumer: Thread-6: 31
Consumer: Thread-5: 31
Consumer: Thread-3: 31
Consumer: Thread-2: 31
Consumer: Thread-4: 31
Consumer: Thread-8: 30
Consumer: Thread-7: 30
Consumer: Thread-0: 30
Consumer: Thread-3: 30
Consumer: Thread-6: 30
Consumer: Thread-1: 30
Consumer: Thread-5: 30
Consumer: Thread-4: 30
Consumer: Thread-9: 30
Consumer: Thread-2: 30
Consumer: Thread-8: 29
Consumer: Thread-7: 29
Consumer: Thread-0: 29
Consumer: Thread-6: 29
Consumer: Thread-5: 29
Consumer: Thread-9: 29
Consumer: Thread-3: 29
Consumer: Thread-2: 29
Consumer: Thread-4: 29
Consumer: Thread-1: 29
Consumer: Thread-8: 28
Consumer: Thread-7: 28
Consumer: Thread-0: 28
Consumer: Thread-3: 28
Consumer: Thread-4: 28
Consumer: Thread-5: 28
Consumer: Thread-1: 28
Consumer: Thread-6: 28
Consumer: Thread-2: 28
Consumer: Thread-9: 28
Consumer: Thread-7: 27
Consumer: Thread-9: 27
Consumer: Thread-0: 27
Consumer: Thread-5: 27
Consumer: Thread-6: 27
Consumer: Thread-1: 27
Consumer: Thread-4: 27
Consumer: Thread-8: 27
Consumer: Thread-3: 27
Consumer: Thread-2: 27
Consumer: Thread-7: 26
Consumer: Thread-6: 26
Consumer: Thread-1: 26
Consumer: Thread-9: 26
Consumer: Thread-4: 26
Consumer: Thread-5: 26
Consumer: Thread-0: 26
Consumer: Thread-3: 26
Consumer: Thread-2: 26
Consumer: Thread-8: 26
Consumer: Thread-7: 25
Consumer: Thread-8: 25
Consumer: Thread-6: 25
Consumer: Thread-2: 25
Consumer: Thread-0: 25
Consumer: Thread-4: 25
Consumer: Thread-1: 25
Consumer: Thread-3: 25
Consumer: Thread-9: 25
Consumer: Thread-5: 25
Consumer: Thread-9: 24
Consumer: Thread-0: 24
Consumer: Thread-3: 24
Consumer: Thread-7: 24
Consumer: Thread-2: 24
Consumer: Thread-4: 24
Consumer: Thread-6: 24
Consumer: Thread-5: 24
Consumer: Thread-1: 24
Consumer: Thread-8: 24
Consumer: Thread-0: 23
Consumer: Thread-8: 23
Consumer: Thread-5: 23
Consumer: Thread-3: 23
Consumer: Thread-2: 23
Consumer: Thread-1: 23
Consumer: Thread-4: 23
Consumer: Thread-9: 23
Consumer: Thread-6: 23
Consumer: Thread-7: 23
Consumer: Thread-0: 22
Consumer: Thread-1: 22
Consumer: Thread-6: 22
Consumer: Thread-9: 22
Consumer: Thread-5: 22
Consumer: Thread-2: 22
Consumer: Thread-3: 22
Consumer: Thread-4: 22
Consumer: Thread-7: 22
Consumer: Thread-8: 22
Consumer: Thread-7: 21
Consumer: Thread-5: 21
Consumer: Thread-3: 21
Consumer: Thread-9: 21
Consumer: Thread-0: 21
Consumer: Thread-4: 21
Consumer: Thread-6: 21
Consumer: Thread-1: 21
Consumer: Thread-2: 21
Consumer: Thread-8: 21
Consumer: Thread-7: 20
Consumer: Thread-3: 20
Consumer: Thread-8: 20
Consumer: Thread-9: 20
Consumer: Thread-5: 20
Consumer: Thread-1: 20
Consumer: Thread-2: 20
Consumer: Thread-6: 20
Consumer: Thread-4: 20
Consumer: Thread-0: 20
Consumer: Thread-3: 19
Consumer: Thread-9: 19
Consumer: Thread-8: 19
Consumer: Thread-5: 19
Consumer: Thread-2: 19
Consumer: Thread-7: 19
Consumer: Thread-4: 19
Consumer: Thread-6: 19
Consumer: Thread-1: 19
Consumer: Thread-0: 19
Consumer: Thread-3: 18
Consumer: Thread-7: 18
Consumer: Thread-4: 18
Consumer: Thread-6: 18
Consumer: Thread-1: 18
Consumer: Thread-8: 18
Consumer: Thread-0: 18
Consumer: Thread-2: 18
Consumer: Thread-5: 18
Consumer: Thread-9: 18
Consumer: Thread-1: 17
Consumer: Thread-3: 17
Consumer: Thread-2: 17
Consumer: Thread-9: 17
Consumer: Thread-5: 17
Consumer: Thread-6: 17
Consumer: Thread-7: 17
Consumer: Thread-4: 17
Consumer: Thread-0: 17
Consumer: Thread-8: 17
Consumer: Thread-5: 16
Consumer: Thread-3: 16
Consumer: Thread-2: 16
Consumer: Thread-7: 16
Consumer: Thread-6: 16
Consumer: Thread-4: 16
Consumer: Thread-8: 16
Consumer: Thread-9: 16
Consumer: Thread-0: 16
Consumer: Thread-1: 16
Consumer: Thread-6: 15
Consumer: Thread-9: 15
Consumer: Thread-0: 15
Consumer: Thread-1: 15
Consumer: Thread-8: 15
Consumer: Thread-7: 15
Consumer: Thread-5: 15
Consumer: Thread-3: 15
Consumer: Thread-2: 15
Consumer: Thread-4: 15
Consumer: Thread-8: 14
Consumer: Thread-7: 14
Consumer: Thread-5: 14
Consumer: Thread-4: 14
Consumer: Thread-9: 14
Consumer: Thread-0: 14
Consumer: Thread-6: 14
Consumer: Thread-1: 14
Consumer: Thread-3: 14
Consumer: Thread-2: 14
Consumer: Thread-4: 13
Consumer: Thread-5: 13
Consumer: Thread-0: 13
Consumer: Thread-7: 13
Consumer: Thread-1: 13
Consumer: Thread-9: 13
Consumer: Thread-2: 13
Consumer: Thread-6: 13
Consumer: Thread-3: 13
Consumer: Thread-8: 13
Consumer: Thread-1: 12
Consumer: Thread-0: 12
Consumer: Thread-9: 12
Consumer: Thread-2: 12
Consumer: Thread-7: 12
Consumer: Thread-3: 12
Consumer: Thread-6: 12
Consumer: Thread-8: 12
Consumer: Thread-4: 12
Consumer: Thread-5: 12
Consumer: Thread-4: 11
Consumer: Thread-9: 11
Consumer: Thread-1: 11
Consumer: Thread-2: 11
Consumer: Thread-6: 11
Consumer: Thread-7: 11
Consumer: Thread-0: 11
Consumer: Thread-3: 11
Consumer: Thread-8: 11
Consumer: Thread-5: 11
Consumer: Thread-5: 10
Consumer: Thread-8: 10
Consumer: Thread-7: 10
Consumer: Thread-0: 10
Consumer: Thread-9: 10
Consumer: Thread-3: 10
Consumer: Thread-1: 10
Consumer: Thread-4: 10
Consumer: Thread-2: 10
Consumer: Thread-6: 10
Consumer: Thread-8: 9
Consumer: Thread-2: 9
Consumer: Thread-9: 9
Consumer: Thread-7: 9
Consumer: Thread-4: 9
Consumer: Thread-1: 9
Consumer: Thread-6: 9
Consumer: Thread-3: 9
Consumer: Thread-5: 9
Consumer: Thread-0: 9
Consumer: Thread-2: 8
Consumer: Thread-0: 8
Consumer: Thread-8: 8
Consumer: Thread-7: 8
Consumer: Thread-9: 8
Consumer: Thread-3: 8
Consumer: Thread-4: 8
Consumer: Thread-6: 8
Consumer: Thread-1: 8
Consumer: Thread-5: 8
Consumer: Thread-6: 7
Consumer: Thread-4: 7
Consumer: Thread-0: 7
Consumer: Thread-7: 7
Consumer: Thread-8: 7
Consumer: Thread-5: 7
Consumer: Thread-1: 7
Consumer: Thread-2: 7
Consumer: Thread-9: 7
Consumer: Thread-3: 7
Consumer: Thread-1: 6
Consumer: Thread-6: 6
Consumer: Thread-3: 6
Consumer: Thread-5: 6
Consumer: Thread-8: 6
Consumer: Thread-9: 6
Consumer: Thread-7: 6
Consumer: Thread-0: 6
Consumer: Thread-4: 6
Consumer: Thread-2: 6
Consumer: Thread-5: 5
Consumer: Thread-1: 5
Consumer: Thread-8: 5
Consumer: Thread-2: 5
Consumer: Thread-6: 5
Consumer: Thread-3: 5
Consumer: Thread-7: 5
Consumer: Thread-9: 5
Consumer: Thread-4: 5
Consumer: Thread-0: 5
Consumer: Thread-5: 4
Consumer: Thread-2: 4
Consumer: Thread-9: 4
Consumer: Thread-3: 4
Consumer: Thread-6: 4
Consumer: Thread-7: 4
Consumer: Thread-8: 4
Consumer: Thread-0: 4
Consumer: Thread-1: 4
Consumer: Thread-4: 4
Consumer: Thread-8: 3
Consumer: Thread-1: 3
Consumer: Thread-9: 3
Consumer: Thread-6: 3
Consumer: Thread-7: 3
Consumer: Thread-0: 3
Consumer: Thread-4: 3
Consumer: Thread-5: 3
Consumer: Thread-3: 3
Consumer: Thread-2: 3
Consumer: Thread-6: 2
Consumer: Thread-2: 2
Consumer: Thread-9: 2
Consumer: Thread-7: 2
Consumer: Thread-1: 2
Consumer: Thread-8: 2
Consumer: Thread-5: 2
Consumer: Thread-0: 2
Consumer: Thread-3: 2
Consumer: Thread-4: 2
Consumer: Thread-6: 1
Consumer: Thread-0: 1
Consumer: Thread-2: 1
Consumer: Thread-8: 1
Consumer: Thread-5: 1
Consumer: Thread-1: 1
Consumer: Thread-3: 1
Consumer: Thread-9: 1
Consumer: Thread-4: 1
Consumer: Thread-7: 1
Consumer: Thread-5: 0
Consumer: Thread-8: 0
Consumer: Thread-3: 0
Consumer: Thread-1: 0
Consumer: Thread-2: 0
Consumer: Thread-6: 0
Consumer: Thread-4: 0
Consumer: Thread-7: 0
Consumer: Thread-0: 0
Consumer: Thread-9: 0
Main: Buffer: Consumer count: 1
Consumer: Core Event 2: 0
Main: End of the program

原理

在这个指南,你已经实现了 MyPriorityTransferQueue 数据结构。这个数据类型是在 producer/consumer 问题中使用的,它的元素是按照优先级排列的。由于 Java 不支持多个继承,所以你首先要决定的是 MyPriorityTransferQueue 类的基类。你扩展了 PriorityBlockingQueue 类,来实现在结构中插入数据按照优先级排序。你也实现了 TransferQueue 接口,添加了与 producer/consumer 相关的3个方法。

MyPriortyTransferQueue 类有以下2个属性:

  1. AtomicInteger 属性,名为 counter: 此属性储存了正在等待从数据类型提取元素的消费者的数量。当一个消费者调用 take()操作来从数据类型中提取元素时,counter 数增加。当消费者结束 take() 操作的执行时,counter 数再次增加。在 hasWaitingConsumer() 和 getWaitingConsumerCount() 方法的实现中使用到了 counter。

  2. ReentrantLock 属性,名为 lock: 此属性是用来控制访问已实现的操作。只有一个线程可以用数据类型。最后一个,LinkedBlockingQueue list 用来储存传输的元素。

在 MyPriorityTransferQueue 中,你实现了一些方法。全部方法都在 TransferQueue 接口中声明了和在PriorityBlockingQueue 接口实现的 take() 方法。在之前已经描述了2个方法了。来看看剩下的方法的描述:

  • tryTransfer(E e): 此方法尝试直接发送元素给消费者。如果有消费者在等待,此方法储存元素到 priority queue 中为了立刻提供给消费者,并返回 true 值。如果没有消费者在等待,方法返回 false 值。

  • transfer(E e): 此方法直接发送元素给消费者。如果有消费者在等待,此方法储存元素到 priority queue 中为了立刻提供给消费者。

否则,把元素储存到已传输的元素list 并阻塞线程直到元素被消耗。当线程进入休眠时,你要释放锁,如果不的话,你就阻塞了queue。

  • tryTransfer(E e, long timeout, TimeUnit unit): 此方法与 transfer() 方法相似,只是它的线程被阻塞的时间段是由参数决定的。当线程进入休眠时,你要释放锁,如果不的话,你就阻塞了queue。

  • take(): 此方法返回下一个要被消耗的元素。如果在 transferred 元素list中有元素,就从list中取走元素。否则,就从 priority queue 中取元素。

一旦你实现了数据类型,你就实现了 Event 类。它就是在数据类型里储存的元素构成的类。Event 类有2个属性用来储存生产者的ID和事件的优先级,并实现了 Comparable 接口,为了满足你的数据类型的需要。

接着,你实现了 Producer 和 Consumer 类。在这个例子中,你有 10 个生产者和一个消费者,他们共享同一个 buffer。每个生产者生成100个事件,他们的优先级是递增的, 所以有高优先级的事件在越后面才生成。

转自: ifeve