نظر: خطای اجرا در حل مساله تولید کننده و مصرف کننده به صورت چند نخی

ساخت وبلاگ

در حل مساله تولید کننده و مصرف کننده به صورت چند نخی در جاوا، چرا کد زیر دچار خطای زمان اجرا می شود؟

با فرض کد زیر برای تولید کننده:

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(); }
}
و تنها کافیست شرط در کلاس مصرف کننده به حلقه تبدیل شود تا این خطا برطرف شود در حالی که منطقی نیست این اتفاق. یعنی اگر به جای if(size==0) قرار دهیم while(size==0) مشکل حل می شود
انتظار دارم وقتی ما یک بار روی لیست wait میکنیم برای منتظر شدن تا پر شدن لیست کافی باشد

جواب یاب...
ما را در سایت جواب یاب دنبال می کنید

برچسب : نویسنده : محمد رضا جوادیان javabyab بازدید : 119 تاريخ : پنجشنبه 28 مرداد 1395 ساعت: 18:51