
سلام ، توی این سری پست ها قراره که در مورد multi threading یاد بگیریم.
فرض کنید که به یه رستوران شلوغ برای خوردن شام رفتید ، سفارشتون رو دادید و منتظرید که غذاتون رو براتون بیارن. کاری که توی پشت صحنه داره انجام میشه چیه؟ یه سری آشپز توی آشپرخونه ی رستوران هستن که دارن باهم کار میکنن؛ تعدادیشون مشغول آماده کردن سالادها هستن ، تعدادیشون مشغول پخت غذاها و تعدادیشون هم مشغول تزیین کردن غذاهای آماده شده ان که قراره تحویل مشتری ها بشن. شاید الان براتون سوال باشه که این جریان رستوران چه ارتباطی به بحث multi threading داره.
به اجرای همزمان چند thread (نخ) توی یه برنامه جاوا ، multi threading گفته میشه. همونطور که توی رستوران چند آشپز دارن همزمان کار میکنن تا سفارش ها زودتر آماده بشه ، توی جاوا هم در بعضی موارد ما نیاز داریم که قسمت هایی از منطق برنامه ، همزمان اجرا بشن تا توی کوتاه ترین زمان نتیجه به دست بیاد.
در حالت کلی thread یه sub-process سبک هست که به ما این امکان رو میده تا کارهای مختلف رو همزمان انجام بدیم و در کل باعث بهبود عملکرد برنامه میشه.
قبل از اینکه وارد مباحث ساخت و استفاده از thread بشیم ، بهتره ببینیم که یه برنامه جاوا که داخلش از multi threading استفاده نشده چطوری کار میکنه. برای این کار یه پروژه جاوا توی intellij میسازیم:

بعدش توی مسیر src/main/java یه پکیج به نام part1 میسازیم و داخلش یه کلاس به نام NormalJavaWithoutMultiThreading میسازیم ، توی این کلاس قراره که کدهامون رو بنویسیم:

برای اینکه کدهای داخل کلاس بتونن اجرا بشن به متد main نیاز داریم ؛ پس اون رو هم تعریف میکنیم:

حالا میتونیم کدهامون رو داخل متد main بنویسیم. برای اینکه بتونیم رفتار جاوا رو توی این سناریو (استفاده نکردن از multi threading) بررسی و تست کنیم به دو تا حلقه for نیاز داریم ؛ اولی برای پرینت کردن اعداد از 0 تا 10 و دومی برای پرینت کردن اعداد از 11 تا 20. پس مینویسیم:

حالا برنامه رو اجرا میکنیم تا خروجیش رو ببینیم. خروجی برنامه باید مثل تصویر پایین باشه:

همونطور که میبینید اعدا از 0 تا 20 بهمون نمایش داده شدن. نتیجه ای که میتونیم بگیریم اینه که کدهایی که توی جاوا نوشتیم در حالت عادی ، پشت سر هم (خطی) اجرا میشن. این روش برای اکثر جاها جواب میده ولی در مواردی ما نیاز داریم که قسمت هایی از برنامه بصورت همزمان (موازی) باهم کار کنن ؛ اونجاست که باید از multi threading استفاده کنیم.
نکته ی مهمی که اینجا وجود داره اینه که ما وقتی برنامه جاوا رو اجرا میکنیم ، جاوا یه thread به نام main میسازه و برنامه رو روی اون اجرا میکنه. برای اینکه صحت این موضوع رو بررسی کنیم میتونیم این کار رو بکنیم؛ اول باید روی حلقه ی for دوم یه breakpoint بزاریم تا زمانی که برنامه به اون خط رسید pause بشه:

و بعدش برنامه رو روی حالت debug اجرا کنیم ؛ برای این کار باید روی آیکون debug کلیک کنیم:

بعد از کلیک روی آیکون debug ، یه پنل جدید پایین صفحه intellij برامون باز میشه که اسم thread اصلی ای که برنامه جاوا روی اون داره اجرا میشه توش نوشته شده:

خب این هم از این. حالا قبل از اینکه وارد مباحث thread توی جاوا بشیم ، اول باید با مفهوم thread آشنا بشیم. از اونجایی که thread مختص جاوا نیست و مربوط به مباحث سیستم عامل میشه ؛ اول باید بدونیم که خود سیستم عامل چطوری thread هارو میسازه و باهاشون کار میکنه.
همه این مباحث رو توی قسمت بعد قراره بررسی کنیم.
امیدوارم که تا اینجای کار براتون مفید بوده باشه
فعلا :)