Поведение состоит Отметы в последовательном порядке, в котором потоки используются в Enqueue The Values, но это не так.
Это код:
Код: Выделить всё
public class MultiThreadTests {
private static final int QUEUE_LENGTH = 100_000;
public static void main(String[] args) throws InterruptedException {
usingTwoThreadsAndArrayBlockingQueue();
}
private static void usingTwoThreadsAndArrayBlockingQueue() throws InterruptedException {
ArrayBlockingQueue q = new ArrayBlockingQueue(QUEUE_LENGTH);
ArrayBlockingQueueClientThread t1 = new ArrayBlockingQueueClientThread(q, 1);
ArrayBlockingQueueClientThread t2 = new ArrayBlockingQueueClientThread(q, 2000);
t1.start();
t2.start();
}
static class ArrayBlockingQueueClientThread extends Thread {
ArrayBlockingQueue q;
int m;
ArrayBlockingQueueClientThread(ArrayBlockingQueue ephemeralQueue, int m) {
this.q = ephemeralQueue;
this.m = m;
}
public void run() {
for (int i = 0; i < 20 ; i++) {
q.add(i * m);
}
// I should still see the correct order when I dequeue concurrently, but I do not.
int k = 0;
while(k
Это выход (однако он не согласуется): < /strong>
| |
| ----- |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 0 |
| 11 |
| 12 |
| 13 |
| 10 |
| 14 |
| 16 |
| 17 |
| 18 |
| 19 |
| 0 |
| 2000 |
| 4000 |
| 15 |
| 8000 |
| 10000 |
| 12000 |
| 14000 |
| 16000 |
| 18000 |
| 6000 |
| 22000 |
| 24000 |
| 26000 |
| 28000 |
| 30000 |
| 20000 |
| 34000 |
| 36000 |
| 32000 |
| 38000 |
Некоторые значения находятся вне порядок Подробнее здесь: https://stackoverflow.com/questions/794 ... arrayblock