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

时间:2016-02-27 03:11:30

标签: java multithreading synchronization queue producer-consumer

使用线程&amp ;;的Java生产者 - 消费者计划同步队列,程序分为3个类,但无法运行。

Queue.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;
    }
}

SynchronizedQueue.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.Error:未解析的编译   问题:在Ch10_3.main(Ch10_3.java:41)

1 个答案:

答案 0 :(得分:0)

在来自catchenqueue方法的dequeue块中,您正在尝试转换类型为{SynchronizedQueue的{​​{1}}成员属性1}},queue

Queue我们有:

SynchronizedQueue

由于SynchronizedQueue.enqueue()((SynchronizedQueue) queue).enqueue(value); 之间没有关系,编译器会给出编译错误。你应该删除演员。

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