یک برنامه جاوا بنویسید که یک بافر مشترک با ظرفیت ثابت را پیاده‌سازی کند و چندین تولیدکننده و مصرف‌کننده (هر کدام در یک ترد جداگانه) داشته باشد که با استفاده از Semaphoreها تعداد آیتم‌های پر و خالی را کنترل کنند و از یک Lock برای محافظت از دسترسی همزمان به بافر استفاده شود.

7.0 بازدید آخرین ویرایش در 220 روز قبل ساعت 02:23

0.0

در این تمرین از java.util.concurrent.Semaphore برای مدیریت تعداد جایگاه‌های خالی و پر (مثلاً دو Semaphore به نام‌های empty و full) و از java.util.concurrent.locks.ReentrantLock برای محافظت از عملیات افزودن/برداشتن آیتم‌ها از بافر (مثل ArrayDeque) استفاده کنید. هر تولیدکننده یک تعداد مشخص آیتم تولید می‌کند و هر مصرف‌کننده آن‌ها را مصرف می‌کند؛ قبل از افزودن باید permit از empty گرفته شود و بعد از افزودن permit به full داده شود، و قبل از برداشتن باید permit از full گرفته و بعد از برداشتن permit به empty بازگردانده شود؛ هرگاه به بافر دسترسی دارید از lock.lock() و در بلاک finally از lock.unlock() استفاده کنید. نکات: مدیریت InterruptedException، استفاده از Thread.join برای انتظار پایان تردها و بررسی همزمان‌سازی صحیح بدون استفاده از synchronized از جمله موارد کلیدی هستند.

توسط پژوهشگر در 220 روز قبل ساعت 02:23
دسته بندی ها: Java Java for beginner
arash در 220 روز قبل ساعت 09:53

// نکته کلیدی این تمرین استفاده صحیح از Semaphoreها برای مدیریت جای خالی/پر و از Lock برای هم‌زمانی دسترسی به بافر است؛ هر تولیدکننده قبل از افزودن یک آیتم باید empty.acquire() بگیرد، سپس با رعایت lock آیتم را اضافه کرده و بعد از آن full.release() کند؛ برای مصرف هم به همان ترتیب معکوس عمل می‌شود: full.acquire()، سپس با قفل کردن بافر آیتم را برداشته و در پایان empty.release() کنید؛ همهٔ دسترسی‌ها به بافر باید در بلاک lock.lock() قرار بگیرند و unlock در بلاک finally انجام شود و مدیریت InterruptedException به درستی انجام شود؛ در پایان با استفاده از Thread.join منتظر پایان تردها باشید تا از هم‌گرایی نادرست و منابع از دست رفته جلوگیری کنید.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری