生产者和消费者上的 Java 同步队列线程



Java 生产者-消费者程序 使用线程和同步队列,该程序分为 3 个类,但无法运行。

队列.java:

public class Queue {
    static final int MAXQUEUE = 3;
    int[] queue = new int[MAXQUEUE];
    int front, rear;
    public Queue(){ front = 0; rear = 0; }
    public boolean isEmpty(){ return (front==rear); }
    public boolean isFull(){
        int index = rear+1 < MAXQUEUE ? rear+1 : 0;
        return (index == front);
    }
    public void enqueue(int value) {
        queue[rear] = value;
        rear = rear+1 < MAXQUEUE ? rear+1 : 0; 
    }
    public int dequeue(){
        int data = queue[front];
        front = front+1 < MAXQUEUE ? rear+1 : 0;
        return data;
    }
}

SyncdQueue.java:

import java.util.Queue;
public class SynchronizedQueue {
    Queue queue;
    public SynchronizedQueue() {queue = new Queue(); }
    public synchronized void enqueue(int value) {
        try {
            while (queue.isFull()) {
                System.out.println();
                System.out.println("Queue is full, please wait....");
                wait();
            }
        }
        catch (InterruptedException e) { }
        ((SynchronizedQueue) queue).enqueue(value);
        notify();
    }
    public synchronized int dequeue() {
        try {
            while (queue.isEmpty()) {
                System.out.println();
                System.out.println("Queue is empty, please wait....");
                wait();
            }
        }
        catch ( InterruptedException e ) { }
        int data = ((SynchronizedQueue) queue).dequeue();
        notify();
        return data;
    }
}

主程序Ch10_3.java:

class Producer extends Thread {
    public int count = 0;
    public void run() {
        int value;
        while ( Ch10_3.isRunning ) {
            value = (int)(Math.random()*100);
            Ch10_3.squeue.enqueue(value);
            System.out.print(">" + value + "]");
            count++;
            try {
                Thread.sleep((int)(Math.random()*100));
            }
            catch( InterruptedException e) { }
        }
        System.out.println("n" + Thread.currentThread() + "Producer thread end.");
    }
}
class Consumer extends Thread {
    public int count = 0;
    public void run() {
        int data;
        while (Ch10_3.isRunning) {
            data = Ch10_3.squeue.dequeue();
            System.out.println("[" + data + ">");
            count++;
            try {
                Thread.sleep((int)(Math.random()*100));
            }
            catch( InterruptedException e) { }
        }
        System.out.println("n" + Thread.currentThread() + "Consumer thread end.");
    }
}
public class Ch10_3 {
    static final int MAXITEMS = 10;
    static SynchonizedQueue squeue = new SynchronizedQueue();
    static boolean isRunning = true;
    public static void main(String[] args) {
        Producer producer = new Producer();
        Consumer consumer = new Consumer();
        producer.start();   consumer.start();
        while (true)
            if (producer.count >= MAXITEMS && producer.count == consumer.count)
            {   isRunning = false;  break; }
    }
}

错误信息:

线程"main"java.lang 中的异常:未解析的编译 问题:在 Ch10_3.main(Ch10_3.java:41)

enqueuedequeue方法SynchronizedQueuecatch块中,您正在尝试将类型为 Queuequeue 成员属性转换为 SynchronizedQueue

SynchronizedQueue.enqueue()我们有:

((SynchronizedQueue) queue).enqueue(value);

由于QueueSynchronizedQueue之间没有关系,因此编译器会给出编译错误。您应该移除石膏。

但最好的解决方案是只使用JAVA SDK中提供的java.util.concurrent.BlockingQueue实现,它将为您处理所有同步部分。

最新更新