53 lines
4.7 KiB
Markdown
53 lines
4.7 KiB
Markdown
<div dir="rtl">
|
|
|
|
# گزارش پروژه هشتم - برنامهنویسی پیشرفته
|
|
|
|
**نام دانشجو:** امیرعلی امیری
|
|
**درس:** برنامهنویسی پیشرفته (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` پاس داد. این کار خوانایی کد را افزایش میدهد، در حالی که عملکرد آن در پشت صحنه هیچ تفاوتی با روشهای گذشته ندارد.
|
|
|
|
</div> |