در حل مساله تولید کننده و مصرف کننده به صورت چند نخی در جاوا، چرا کد زیر دچار خطای زمان اجرا می شود؟
با فرض کد زیر برای تولید کننده:
public class Producer extends Thread{
List<Integer> data;
public Producer(List<Integer> l) {
data=l;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
synchronized (data) {
int t=(int)(Math.random()*1000);
data.add(t);
System.out.println(this.getId()+":Add:"+t);
data.notify();
}
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
و کد زیر برای مصرف کننده:
public class Consumer extends Thread{
List<Integer> data;
public Consumer(List<Integer> l) {
data=l;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
synchronized (data) {
if(data.size()==0)
try {
data.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep((int)(Math.random()*100));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.getId()+":Remove:"+data.remove(0));
}
}
}
}
و کد زیر برای روال اجرایی برنامه:
public class Admin {
public static void main(String[] args) throws InterruptedException {
List<Integer> list=new ArrayList<Integer>();
Thread[] threads={
new Producer(list), new Producer(list),
new Consumer(list), new Consumer(list)
};
for (Thread thread : threads)
thread.start();
for (Thread thread : threads)
thread.join();
}
}