3.5 KiB
خروجی برنامه به این شکل است: اول خط Calling run چاپ میشود، بعد خط Running in: main، بعد خط Calling start و در نهایت خط Running in: Thread-2.
دلیلش این است که وقتی ران را صدا میزنیم، اصلاً ترد جدیدی ساخته نمیشود. متد ران دقیقاً مثل یک متد معمولی در همان ترد فعلی که اینجا همان مین است اجرا میشود. اما وقتی استارت را میزنیم، جاوا یک ترد جدید در پسزمینه به اسم Thread-2 میسازد و متد ران را میاندازد آنجا تا اجرا شود.
فرق اصلی این دو در این است که وقتی ران را صدا میزنیم، کار کاملاً همگام پیش میرود. یعنی برنامه همانجا میایستد تا اجرای متد تمام شود و بعد میرود خط بعدی. اما وقتی استارت را صدا میزنیم، کار ناهمگام میشود. یک ترد جدید ساخته میشود و کار را میسپارد به آن، برنامه هم دیگر معطل نمیماند و سریع میرود سراغ اجرای خط بعدی.
خروجی برنامه احتمالاً فقط یک خط است که مینویسد مین ترد اندز.
دلیلش این است که در جاوا ما کلاً دو مدل ترد داریم یکی تردهای معمولی و یکی تردهای دیمون. ماشین مجازی جاوا اصلاً منتظر تمام شدن کار تردهای دیمون نمیماند. یعنی به محض اینکه کار تردهای اصلی تمام شود، برنامه را میبندد و تردهای دیمون در هر وضعیتی که باشند درجا قطع میشوند.
اگر خط مربوط به تنظیم دیمون را پاک کنیم، ترد ما تبدیل میشود به یک ترد معمولی. آن وقت ماشین مجازی مجبور است صبر کند تا حلقه به طور کامل تمام شود و تازه بعدش برنامه بسته میشود.
این تردها در دنیای واقعی بیشتر برای کارهای پسزمینه استفاده میشوند که خیلی حیاتی نیستند ولی باید باشند. مثلاً سیستم تمیزکننده حافظه جاوا که خودش در پسزمینه حافظه را پاک میکند، یا قابلیت ذخیره خودکار در برنامهها که هر چند دقیقه یک بار خودکار تغییرات را ذخیره میکنند.
خروجی برنامه به این صورت است که پیام اجرای ترد با استفاده از لامبدا چاپ میشود.
به این مدل کد زدن عبارت لامبدا میگویند که از نسخه هشت جاوا به بعد اضافه شد.
فرق این روش با ساختن کلاسی که از کلاس ترد ارثبری میکند در این است که خیلی خلاصهتر و جمعوجورتر است. دیگر نیازی نیست کلی کد اضافه بنویسیم یا یک کلاس جدا بسازیم و متد ران را بازنویسی کنیم. منطق کد را خیلی راحت همانجا مینویسیم. اینطوری کد خیلی تمیزتر و خواناتر میشود، مخصوصاً برای وقتهایی که فقط میخواهیم یک تکه کد کوچک را سریع در یک ترد اجرا کنیم.