需要帮助修复线程“ main”中的异常

问题描述 投票:-1回答:2

我正在尝试解决ProducerConsumer问题,并且可以编译我的代码,但是它无法运行。我尽一切努力修复它,但它一直给我这个错误:

[线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:在ProducerConsumer.main(ProducerConsumer.java:55)处长度为0的索引0超出范围]

public class ProducerConsumer {
 LinkedList<Integer>buffer = new LinkedList<>();
 Semaphore mutex = new Semaphore(1);
 Semaphore empty = new Semaphore(5);
 Semaphore full = new Semaphore(0);
 int maxBuffer = 5;

 Random rand = new Random();


 public ProducerConsumer(){}

 public synchronized void consumer()throws InterruptedException{

    while (true) {
        synchronized (this) {
            while (buffer.size() == maxBuffer) {
                wait();
            }
          int value = rand.nextInt(100000);
          System.out.println("Consumer produced"+ value);
          buffer.add(value);
          notify();
          Thread.sleep(rand.nextInt(500));
        }
    }
}
  public synchronized void produce() throws InterruptedException{
      while (true) {
          synchronized (this) {
              while (buffer.size() == maxBuffer) {
                  wait();
              }
            int value = rand.nextInt(100000);
            System.out.println("Producer produced" + value);
            buffer.add(value);
            notify();
            Thread.sleep(rand.nextInt(500));
          }
      }
  }

  public static void main(String [] args) throws InterruptedException{

      int sleep = Integer.parseInt(args[0]);
      System.out.println("Sleep time=" +sleep);
      int produce = Integer.parseInt(args[1]);
      System.out.println("Producer threads =" + produce);
      int consumer = Integer.parseInt(args[2]);
      System.out.println("Consumer threads =" + consumer);

      ProducerConsumer pc = new ProducerConsumer();

      LinkedList<Integer> buffer = new LinkedList<>();

      for(int i=0; i < produce; i++) {
          Thread thread1 = new Thread(new Runnable()
                  {
              public void run()
              {
                  try {
                      pc.produce();
                  }   catch(InterruptedException e) {
                      e.printStackTrace();
                  }
              }
        });

          thread1.start();
          thread1.join();
      }

      for(int i= 0; i < consumer; i++) {
          Thread thread2 = new Thread(new Runnable()
            {
              public void run()
              {
                  try {
                      pc.consumer();
                  }   catch(InterruptedException e) {
                      e.printStackTrace();
                  }
              }
        });

          thread2.start();
          thread2.join();
      } 
      try {
    Thread.sleep(0);
      } catch(InterruptedException e) {
          e.printStackTrace();
      }
  }
}

谁能帮我。

java producer-consumer
2个回答
1
投票

您忘了争论。该程序被编写为使用3个参数(睡眠时间,生产者和消费者)进行编译。所有整数。

错误代码告诉您这里到底有什么问题:它不能访问小于n的某个数组的第n个元素,因为该元素不存在。

[执行时,请使用:例如java ProducerConsumer 2 2 2


-2
投票

首先,请尽量不要擦除代码中的重要字符,例如正确关闭构造函数或调用线程时。我会更正,但已经有另一个版本在等您。

无论如何,当我们尝试访问甚至不存在的数组上的索引时,经常会发生超出范围的异常。虽然,我看不到LinkedList会有问题,您能否完整记录异常情况以查看其确切来源?

© www.soinside.com 2019 - 2024. All rights reserved.