یک برنامه Java بنویسید که چند نخ تولیدکننده و چند نخ مصرفکننده را راهاندازی کند؛ تولیدکنندهها اعداد صحیح را در یک ConcurrentLinkedQueue یا LinkedBlockingQueue قرار میدهند و مصرفکنندهها آنها را برمیدارند و مجموع اعداد مصرفشده را محاسبه میکنند، بهطوری که از مجموعههای همزمان در java.util.concurrent برای جلوگیری از قفلگذاری دستی استفاده شود.
9.0 بازدید آخرین ویرایش در 202 روز قبل ساعت 03:00 0.0
از مجموعههای همزمان مانند ConcurrentLinkedQueue یا LinkedBlockingQueue در پکیج java.util.concurrent استفاده کنید و برای مدیریت نخها از ExecutorService بهره ببرید. برای متوقفکردن مصرفکنندهها روشهایی مثل ارسال یک "poison pill" پس از پایان تولید یا استفاده از CountDownLatch/AtomicInteger برای پیگیری تعداد آیتمهای تولیدشده به کار ببرید؛ از متدهای thread-safe مجموعهها (مثلاً put/take در BlockingQueue) استفاده کنید تا نیازی به synchronized نباشد.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
استفاده از BlockingQueue مانند LinkedBlockingQueue به همراه ExecutorService ایده خوبی است زیرا عملیات put و take بهطور thread-safe انجام میشوند و از قفلگذاری دستی بینیاز میشوید. برای پایاندادن مصرفکنندگان از poison pill استفاده کنید، اما در حالت چند نخ مصرفکننده باید به ازای هر مصرفکننده یک poison pill بفرستید تا همه نخها پس از پایان تولید کار را تمام کنند. برای جمعآوری مجموع اعداد مصرفشده از AtomicLong استفاده کنید تا همزمانی بدون قفل حفظ شود و نتیجه نهایی با پایان یافتن همه کارها قابل نمایش باشد. همچنین میتوانید از CountDownLatch یا CyclicBarrier برای هماهنگی شروع و پایان کار استفاده کنید تا از اجرای همزمان ناقص جلوگیری شود.
گزارش