4.7 KiB
گزارش پروژه هشتم - برنامهنویسی پیشرفته
نام دانشجو: امیرعلی امیری
درس: برنامهنویسی پیشرفته (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 پاس داد. این کار خوانایی کد را افزایش میدهد، در حالی که عملکرد آن در پشت صحنه هیچ تفاوتی با روشهای گذشته ندارد.