{CodeGate}

مسئله تولید کننده و مصرف کننده در جاوا (producer consumer)

در این جلسه تیم کدگیت را با آموزش مسئله تولید کننده و مصرف کننده در جاوا همراهی کنید.پیش نیاز این آموزش آشنایی با inner class و thread است. در این آموزش اگر با inner class آشنایی ندارید مشکلی ندارد و آموزش متوجه خواهید شد. پیش نیاز اصلی این آموزش آشنایی با سمافور است که در آموزش گذشته به طور کامل توضیح داده شده است.

مسئله تولید کننده و مصرف کننده

مسئله تولیدکننده-مصرف‌کننده (Producer–consumer problem ) یا مسئله بافر محدود (bounded-buffer problem ) مسئله‌ای کلاسیک در همگام‌سازی چندپروسه‌ای است که این پروسه‌ها یک ناحیه بحرانی مشترک (Critical Section ) دارند.

در این مسئله، دو فرایند به نام‌های تولیدکننده و مصرف‌کننده وجود دارد که یک بافر با اندازه‌ای ثابت در بین آنها به اشتراک گذاشته شده و آنها از این بافر به عنوان صف استفاده می‌کنند. وظیفه تولیدکننده این است که یک قلم داده تولید کرده و در بافر قرار دهد. به شکل همزمان، مصرف‌کننده باید این قلم داده را از بافر بردارد و آن را به مصرف برساند. تولیدکننده و مصرف‌کننده تنها می‌توانند هر بار یک قلم داده را در بافر قرار دهند یا از بافر بردارند. مسئله اینجاست که ما باید مطمئن شویم که تولیدکننده سعی نمی‌کند در یک بافر پر شده، داده‌ای را ذخیره کند و یا به طور مشابه، مصرف‌کننده سعی نکند داده‌ای را از یک بافر خالی بردارد. هرگاه که بافر پر بود و تولیدکننده خواست چیزی را در آن ذخیره کند، باید به خواب برود تا اینکه مصرف‌کننده یک قلم داده را از بافر بردارد و بعد از آن تولیدکننده را از خواب بیدار کند. به طور مشابه، اگر مصرف‌کننده خواست یک قلم داده را از یک بافر خالی بردارد، باید به خواب برود تا تولیدکنده یک قلم داده را در بافر قرار دهد و سپس مصرف‌کننده را بیدار کند. یک راه حل نامناسب برای این مسئله، می‌تواند به بن‌بست منجر شود که در آن هر دو پروس همزمان به خواب می‌روند و هیچکس نیست تا آنها را از خواب بیدار کند که باید جلوی این اتفاق را گرفت. این مسئله را می‌توان به n تولیدکننده و m مصرف‌کننده تعمیم داد(ویکیپدیا).

مسئله تولید کننده و مصرف کننده در جاوا

ما در این آموزش فرض میکنیم که بافر نامحدود است(برای سادگی کار) و آموزش بعدی به پیاده سازی بافر محدود میپردازیم.

پیاده سازی مسئله تولید کننده و مصرف کننده در جاوا

برای پیاده سازی مسئله تولید کننده و مصرف کننده با بافر نامحدود از یک arraylist استفاده میکنیم که نقش بافر را دارد. ما هر بار عددی بین 0 تا 1 را در آن قرار میدهیم و به طور همزمان نیز از آن عدد استفاده میکنیم.

برای پیاده سازی تولید کننده ما یک کلاس درونی (inner class) برای خود نوشتیم به نام producer و دقیقا همین کار را برای مصرف کننده انجام دادیم ولی نام کلاس consumer هست. هر دو کلاس نوعی از runnable هستند.در آخر برای اجرای thread ها یک متد به نام buildthreads نوشتیم.برای تست برنامه ما buildthreads را صدا زدیم.

در کد مسئله تولید کننده و مصرف کننده در جاوا  از فیلد های زیر استفاده میشود:

  1. Buffer : این فیلد همان بافر نامحدود ماست.
  2. Mutex: این هم سمافوری برای ناحیه بحرانی ما است. چک میکند چند درخواست همزمان وارد ناحیه بحرانی ما نشود.

کد مسئله تولید کننده و مصرف کننده در جاوا شامل متدهای زیر است:

  1. Produce: شامل کد تولید کننده است و عددی را به بافر اضافه میکند.
  2. Consumer: شامل کد مصرف کننده است. یکی از سایز بافر ما کم کیشود.
  3. Run: این متد در کد بالا دو بار استفاده شده است و هر کدام متد های شماره 1 و 2 را صدا میزنند.
  4. Buildthreads: متد ساختن thread جداگانه برای هر کدام از producer و consumer ما.

قسمتی از خروجی برنامه مسئله تولید کننده و مصرف کننده در جاوا به صورت زیر است:

پسورد: www.codegate.ir

دسته : java, جاوا, حل مسائل با جاوا, همزمانی در جاوا (MultiThreading)

دیدگاه بگذارید

نظر شما چیست؟

مطلع کردن شما از
avatar

wpDiscuz