スレッドセーフなブロッキングキューをjavaで実装していますが、スレッドが順番に実行されていて並列に実行されていないようです。誰かが私が間違っていることを見つけるのを助けることができますか?私のコードは次の通りです:Javaでブロッキングキューを実装する際の問題
package com.example;
import java.util.LinkedList;
import java.util.List;
class Producer implements Runnable{
BlockingQueue blockingQueue;
public Producer(BlockingQueue blockingQueue) {
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
int counter = 0;
while (true)
{
try
{
blockingQueue.enqueue(counter++);
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
BlockingQueue blockingQueue;
public Consumer(BlockingQueue blockingQueue) {
this.blockingQueue = blockingQueue;
}
@Override
public void run() {
while (true)
{
try
{
blockingQueue.dequeue();
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
}
}
}
public class Test{
public static void main(String[] args) {
BlockingQueue blockingQueue = new BlockingQueue(10);
Thread producer = new Thread(new Producer(blockingQueue), "Prod");
Thread consumer = new Thread(new Consumer(blockingQueue), "Cons");
producer.start();
consumer.start();
}
}
class BlockingQueue {
private List queue = new LinkedList();
private int limit = 10;
public BlockingQueue(int limit){
this.limit = limit;
}
public synchronized void enqueue(Object item)
throws InterruptedException {
while(this.queue.size() == this.limit) {
System.out.println("Wait Enque : "+Thread.currentThread().getName());
wait();
}
Thread.sleep(1000);
System.out.println("Add Item : " + Thread.currentThread().getName());
this.queue.add(item);
notifyAll();
}
public synchronized Object dequeue()
throws InterruptedException{
while(this.queue.size() == 0){
System.out.println("Wait Denque : "+Thread.currentThread().getName());
wait();
}
Thread.sleep(1000);
System.out.println("Remove Item : " + Thread.currentThread().getName());
notifyAll();
return this.queue.remove(0);
}
}
私はマルチスレッド化が初めてです。
これは私が取得しています出力されます。BlockingQueue
の
Add Item : Prod
Add Item : Prod
Add Item : Prod
Add Item : Prod
Add Item : Prod
Add Item : Prod
Add Item : Prod
Add Item : Prod
Add Item : Prod
Add Item : Prod
Wait Enque : Prod
Remove Item : Cons
Remove Item : Cons
Remove Item : Cons
Remove Item : Cons
Remove Item : Cons
Remove Item : Cons
Remove Item : Cons
Remove Item : Cons
Remove Item : Cons
Remove Item : Cons
Wait Denque : Cons
Add Item : Prod
Add Item : Prod
Add Item : Prod
出力の一部を表示することができます。一見すると、あなたのコードはOKです。 – GhostCat
彼は彼自身のクラスBlockingQueueを提供しています。たぶんそれは悪い命名です。本当に問題はありません。 – GhostCat
はい私は私の質問を編集しました – Qasim