我正在研究BlockingQueue接口,其中ArrayBlockingQueue是一個實現。用於演示的目的,我有下發展下面的代碼:ArrayBlockingQueue顯示已被執行的行爲
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class MainJava {
public static void main(String[] args) {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(1);
Producer producer = new Producer(queue);
Consumer consumer = new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
}
}
class Producer implements Runnable {
BlockingQueue<String> queue = null;
public Producer(BlockingQueue<String> queue) {
this.queue = queue;
// TODO Auto-generated constructor stub
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
System.out.println("Producer added " + i);
queue.put(String.valueOf(i));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
BlockingQueue<String> queue = null;
public Consumer(BlockingQueue<String> queue) {
this.queue = queue;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
System.out.println("Consumer used " + queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
預期的行爲
Producer add 0
Consumer used 0
Producer add 1
Consumer used 1
and so on..
Actaul O/P
Producer added 0
Producer added 1
Consumer used 0
Consumer used 1
Producer added 2
Producer added 3
Producer added 4
我用它工作正常調試模式嘗試。那麼爲什麼沒有調試模式,事情不能正常工作?
這是因爲你的兩個線程彼此並行運行!你無法預測他們的行爲! – ItachiUchiha
@IchichiUchiha實際上他有一個大小爲1的阻塞隊列,所以人們總是在等待。這裏的「問題」是他信任System.out.println的輸出以確定它是否正常工作,這是不可靠的。 – Kayaman
我的兩個線程使用一個隊列,其中一個添加項目,另一個刪除它,當生產者添加一個項目,然後嘗試添加另一個項目時,它應該阻止,當que爲空時,消費者應該被阻止,直到項目被添加到隊列中。對於我們可以使用BlockingQueue的權利? – user3608352