3.3 KiB
start() vs run() : What output do you get from the program? Why? وقتی متد run() رو مستقیماً روی آبجکت صدا میزنیم، هیچ Thread جدیدی ساخته نمیشه. در واقع کد ما دقیقاً روی همون Thread اجراکننده فعلی (یعنی main) مثل یه متد معمولی اجرا میشه و تا تموم نشه، برنامه به خط بعدی نمیره اما وقتی start() رو فراخوانی میکنیم، از ماشین مجازی جاوا میخوایم که یک Thread کاملاً جدید در سیستمعامل بسازه و متد run() رو به صورت موازی داخل اون Thread جدید اجرا کنه.
What’s the difference in behavior between calling start() and run()? متد start() چرخه حیات یک Thread جدید رو آغاز میکنه و امکان اجرای موازی رو به ما میده، ولی run() صرفاً یک فراخوانی متد ساده است و هیچ موازیسازیای در کار نیست.
Daemon Threads :
What output do you get from the program? Why? توی جاوا، به محض اینکه کار تمام تردهای اصلی یا اصطلاحاً User Threadها تموم بشه، JVM برنامه رو میبنده و دیگه منتظر تردهای پسزمینه (Daemon) نمیمونه. اینجا چون کار ترد main خیلی سریع تموم میشه، برنامه هم بلافاصله بسته میشه و اجازه نمیده حلقه ۲۰ تایی ترد Daemon کامل بشه.
What happens if you remove thread.setDaemon(true)? با این کار، ترد ما تبدیل به یک User Thread معمولی میشه. در این حالت، حتی اگه ترد main به پایان برسه، برنامه باز میمونه و منتظر میشه تا حلقه ۲۰ تایی (که حدود ۱۰ ثانیه زمان میبره) به طور کامل اجرا بشه و بعد از اون به صورت عادی بسته میشه.
What are some real-life use cases of daemon threads? زبالهروب جاوا (Garbage Collector): تو پسزمینه اجرا میشه و حافظههای بیاستفاده رو آزاد میکنه.
ذخیره خودکار (Auto-Save): توی ادیتورهای کد یا نرمافزارهایی مثل Word برای ذخیره فایلها در پسزمینه بدون ایجاد وقفه تو کار کاربر.
مانیتورینگ و Heartbeat: تردهایی که تو برنامههای شبکهای، سلامت سیستم یا اتصال به سرور رو به صورت مداوم چک میکنن.
A shorter way to create threads :
What output do you get from the program? Thread is running using a ...!
What is the () -> { ... } syntax called? به این سینتکس عبارت لامبدا (Lambda Expression) میگیم.
How is this code different from creating a class that extends Thread or implements Runnable? به جای اینکه بیایم یه کلاس جداگانه بسازیم و کلی کد تکراری بنویسیم تا فقط متد run رو بازنویسی (Override) کنیم، با استفاده از لامبدا میتونیم مستقیماً منطق و بدنه متد رو پاس بدیم.