0

Программа-производитель-потребитель Java с использованием потока синхронизации &, программа разделена на 3 класса, но она не может быть запущена.Java синхронизированный поток очереди на производителя и потребителя

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

Сообщение об ошибке:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: at Ch10_3.main(Ch10_3.java:41)

+0

И какая строка кода является строкой 41 Ch10_3.java? – VGR

+0

'static SynchonizedQueue squeue = new SynchronizedQueue();' – Snowman

+0

вы пропускаете 'SynchonizedQueue' write' SynchronizedQueue'. –

ответ

0

В catch блоков из enqueue и dequeue методов формирования класса SynchronizedQueue вы пытаетесь бросить атрибут queue члена, который имеет тип Queue, чтобы SynchronizedQueue.

В SynchronizedQueue.enqueue() мы имеем:

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

Поскольку не существует никакой связи между Queue и SynchronizedQueue компилятор дает ошибку компиляции. Вы должны удалить бросок.

Но лучшим решением является просто использовать реализацию java.util.concurrent.BlockingQueue, доступную в JAVA SDK, которая будет обрабатывать всю часть синхронизации для вас.

+0

Может содержать новый оператор' @SuppressWarnings ("rawtypes") 'help? Сообщение об ошибке «не может создать экземпляр типа Queue» для этого оператора 'public SynchronizedQueue() {queue = new Queue(); } 'и 'этот метод isFull() не определен для типа Queue« for »while (queue.isFull()) {' – Snowman

+1

Это не поможет, и в целом вы не должны подавлять никаких предупреждений, если не знаете точно, что вы делают, и вы не хотите их беспокоить во время компиляции. Вы обновили код по сравнению с тем, что вы изначально разместили, потому что сообщение об ошибке очень странно? – iullianr

+0

О да, удалил оператор подавления и получил сообщение об ошибке: _Exception в потоке «main» java.lang.Error: нерешенные проблемы с компиляцией: невозможно создать экземпляр типа Queue. Метод isFull() не определен для типа Queue в SynchronizedQueue. (SynchronizedQueue.java:5) в Ch10_3. (Ch10_3.java:38)_ – Snowman

Смежные вопросы