# گزارش پروژه هشتم - برنامه‌نویسی پیشرفته **نام دانشجو:** امیرعلی امیری **درس:** برنامه‌نویسی پیشرفته (AP) --- ## بخش اول: مقایسه `start()` و `run()` ### ۱. خروجی برنامه و دلیل آن * **خروجی فراخوانی `t1.run()`:** عبارت `Running in: main` * **خروجی فراخوانی `t2.start()`:** عبارت `Running in: Thread-2` **دلیل:** هنگام فراخوانی مستقیم متد `t1.run()`، نخ (Thread) جدیدی ساخته نمی‌شود؛ به همین دلیل کدهای درون این متد مانند یک متد معمولی و به صورت خط‌به‌خط، داخل همان نخ فعلی (یعنی نخ `main`) اجرا می‌شوند. اما با فراخوانی متد `t2.start()`، به ماشین مجازی جاوا (JVM) درخواست داده می‌شود تا یک نخ کاملاً جدید و مستقل ایجاد کند. پس از ایجاد این نخ، متد `run()` درون آن و به صورت موازی با نخ اصلی اجرا خواهد شد. ### ۲. تفاوت رفتاری * **متد `start()`:** به صورت غیرهمگام (Asynchronous) عمل می‌کند. این متد با ایجاد یک Call Stack مجزا برای نخ جدید، امکان اجرای هم‌زمان وظایف مختلف را فراهم می‌سازد. * **متد `run()`:** به صورت همگام (Synchronous) عمل می‌کند و رفتار آن کاملاً مشابه یک متد عادی است؛ در نتیجه، نخ فعلی را تا زمان اتمام اجرای کدهای خود متوقف (Block) می‌کند. --- ## بخش دوم: نخ‌های پس‌زمینه (Daemon Threads) ### ۱. خروجی برنامه و دلیل آن * **خروجی:** معمولاً برنامه تنها با چاپ خط `Main thread ends.` پایان می‌یابد. **دلیل:** در جاوا، به محض اتمام کار تمامی نخ‌های کاربر (User Threads یا همان نخ‌های غیر دیمن)، ماشین مجازی جاوا (JVM) به طور خودکار بسته می‌شود. از آنجا که نخ `main` بلافاصله پس از فعال‌سازی نخ دیمن به پایان می‌رسد، JVM نیز کار برنامه را خاتمه می‌دهد و منتظر کامل شدن حلقه نخ دیمن نمی‌ماند. ### ۲. حذف خط `thread.setDaemon(true)` در صورت حذف این خط، نخ به یک نخ کاربر معمولی تبدیل می‌شود. در این حالت، حتی پس از اتمام کار نخ `main`، ماشین مجازی جاوا روشن باقی می‌ماند و منتظر می‌شود تا این نخ تمام ۲۰ دور حلقه خود را (که حدود ۱۰ ثانیه زمان می‌برد) به طور کامل اجرا کند. ### ۳. کاربردهای واقعی نخ‌های Daemon * **سیستم زباله‌روبی جاوا (Garbage Collection):** مدیریت و آزاد‌سازی حافظه بلااستفاده در پس‌زمینه برنامه. * **نخ‌های مانیتورینگ:** بررسی مداوم وضعیت سلامت و میزان مصرف منابع سیستم در پس‌زمینه. * **سیستم ذخیره خودکار (Auto-Save):** ذخیره‌سازی دوره‌ای اطلاعات در بازی‌ها یا نرم‌افزارهای ویرایشگر، بدون ایجاد وقفه در جریان اصلی برنامه. --- ## بخش سوم: روش کوتاه‌تر برای ساخت نخ‌ها (Lambda Expression) ### ۱. خروجی برنامه * **خروجی:** عبارت `Thread is running using a ...!` در کنسول چاپ می‌شود. ### ۲. نام این سینتکس به سینتکس `() -> { ... }` اصطلاحاً **Lambda Expression** (عبارت لمبدا) می‌گویند. ### ۳. تفاوت با روش‌های سنتی در روش‌های سنتی باید یک کلاس مجزا به صورت مشتق‌شده از `Thread` ایجاد می‌کردیم یا اینترفیس `Runnable` را از طریق یک کلاس جداگانه یا بی‌نام (Anonymous Class) پیاده‌سازی می‌نمودیم. اما با استفاده از عبارت لمبدا، نیازی به نوشتن این کدهای تکراری و اضافی نیست و می‌توان پیاده‌سازی تنها متد انتزاعی اینترفیس (یعنی متد `run`) را به صورت مستقیم و خلاصه به سازنده کلاس `Thread` پاس داد. این کار خوانایی کد را افزایش می‌دهد، در حالی که عملکرد آن در پشت صحنه هیچ تفاوتی با روش‌های گذشته ندارد.