Неожиданное поведение с 2 резьбами при использовании встроенной Java ArrayBlockingQueue и пользовательской реализацииJAVA

Программисты JAVA общаются здесь
Anonymous
Неожиданное поведение с 2 резьбами при использовании встроенной Java ArrayBlockingQueue и пользовательской реализации

Сообщение Anonymous »

Здравствуйте, не могли бы вы помочь мне понять неожиданное поведение с 2 потоками Enqueer при использовании встроенной Java Arrayblockqueueue и пользовательской реализации? Декес в последовательном порядке, в котором потоки, используемые в Enqueue The Values, но это не так. < /p>
Это код: < /p>
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
Это выход (однако он не согласуется): < /p>
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 < /p>
видите, так что некоторые значения не Закажите на уровне потока, например, значение 15 и значение 6000. И я не понимаю, почему это так. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/794 ... arrayblock

Вернуться в «JAVA»