0 امتیاز
قبل در برنامه نویسی توسط (10 امتیاز)
ویرایش شده قبل توسط

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

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

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();
	}

}

 

قبل توسط (10 امتیاز)
+1
و تنها کافیست شرط در کلاس مصرف کننده به حلقه تبدیل شود تا این خطا برطرف شود در حالی که منطقی نیست این اتفاق. یعنی اگر به جای if(size==0) قرار دهیم while(size==0) مشکل حل می شود
انتظار دارم وقتی ما یک بار روی لیست wait میکنیم برای منتظر شدن تا پر شدن لیست کافی باشد

سوالات مشابه

0 امتیاز
1 پاسخ 2.8هزار بازدید
+2 امتیاز
1 پاسخ 961 بازدید
+1 امتیاز
1 پاسخ 819 بازدید
0 امتیاز
0 پاسخ 401 بازدید
+2 امتیاز
2 پاسخ 3.0هزار بازدید
0 امتیاز
1 پاسخ 1.8هزار بازدید
0 امتیاز
0 پاسخ 309 بازدید
0 امتیاز
0 پاسخ 326 بازدید
...