我正在尝试解决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();
}
}
}
谁能帮我。
您忘了争论。该程序被编写为使用3个参数(睡眠时间,生产者和消费者)进行编译。所有整数。
错误代码告诉您这里到底有什么问题:它不能访问小于n的某个数组的第n个元素,因为该元素不存在。
[执行时,请使用:例如java ProducerConsumer 2 2 2
。
首先,请尽量不要擦除代码中的重要字符,例如正确关闭构造函数或调用线程时。我会更正,但已经有另一个版本在等您。
无论如何,当我们尝试访问甚至不存在的数组上的索引时,经常会发生超出范围的异常。虽然,我看不到LinkedList会有问题,您能否完整记录异常情况以查看其确切来源?