در حل مساله تولید کننده و مصرف کننده به صورت چند نخی در جاوا، چرا کد زیر دچار خطای زمان اجرا می شود؟
با فرض کد زیر برای تولید کننده:
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(); } }