خرید بک لینک

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

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

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 میکنیم برای منتظر شدن تا پر شدن لیست کافی باشد

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

صفحه بندی