Java Thread
- با شی Thread میتونیم یک فضای جدای پردازشی ایجاد کنیم. برای این کار باید یک کلاس را از آم مشتق کنیم و تابع run را در آن باز نویسی کنیم و با فراخوانی تابع start آن را اجرا کنیم. همچنین مقادیری که برای کنترل فرایند های درون آن نیاز است را میتوانید از طریق تابع سازنده آن ارسال کنیم.
- تابع استاتیک currentThread اطلاعات thread جاری را در اختیار ما قرار میدهد.
- تابع استاتیک sleep باعث به خواب رفتن thread جاری میشود.
- تابع join باعث میشود که thread مورد نظر تا زمان خاتمه یافتن به کار خودش ادامه دهد و thread های دیگر منتظر پایان کار آن شوند.
- تابع setPriority اولویت اجرای یک thread را مشخص میکند. بالاترین اولویت ۱۰ و پایین اولویت ۱ است.
- تابع setDeamon برای تبدیل thread جاری به شبح کاربرد دارد.
- تابع isAlive وضعیت زنده بودن thread را نشان میدهد.
- هر thread یک حافظه stack مخصوص خود دارد.
- دو thread با دسترسی به یک object و با استفاده از توابع wait و notify قادر هستند تا برای انجام فرایندهایی برای یکدیگر صبر کنند. نکته مهم این است که این شی باید در بلاک synchronized باشد.
- شی Runnable کاملا عملکرد مشابهی نسبت به Thread دارد. فقط برای اجرا کردن آن باید یک نمونه از شی Thread بسازیم و به متد سازنده آن یک نمونه از شی Runnable را ارسال کنیم و سپس تابع start را از شی Thread فراخوانی کنیم.
- با شی Exchanger میتوانیم دادهای را بین دو thread جابجا کنیم. نوع دادهای که قرار هستش جابجا بشه به صورت generic در زمان ساخت این شی مشخص میشه. برای انتقال باید تابع exchange رو صدا بزنیم. باید توجه کنید که thread جاری در این خط توقف میکند تا thread دیگر تابع exchange را فراخوانی کند. باید توجه داشته باشید که تابع exchange باعث پرتاب خطای InterruptedException میشه.
- با شی CyclicBarrier میتونیم کار ها رو هماهنگ کنیم. این شی دو تابع سازنده دارد، یکی فقط عددی میگیرد و که مشخص کننده thread هایی است که باید بین آنها هماهنگی ایجاد شود و دیگری علاوه بر این عدد یک شی Runnable نیز میگیرد که بعد از اینکه thread ها به نقطه مشخص شده باید انجام شود. زمانی که فرایند مورد نظر ما تموم میشه باید با صدا زدن تابع await شی CyclicBarrier رو از وضعیتمون آگاه میکنیم و thread ما در همون خط توقف میکنه تا به تعداد مشخص شده تابع await صدا زده بشه و سپس اجازه عبور از اون خط داده میشه و اگه ما Runnableی هم تعریف کرده باشیم اجرا خواهد شد. همچنین تابع await ورودی به عنوان timeOut دریافت میکنه. باید توجه داشته باشید که فراخوانی توابع این شی باعث پرتاب خطای InterruptedException میشه.
- با شی Semaphore میتونیم تعداد thread های در حال اجرا رو کنترل کنیم. این شی در ورودی خودش تعداد مجاز اجرا شدن رو میگیره. برای اجازه گرفتن از این شی باید تابع acquire رو صدا بزنیم و در صورتی که تعداد مجاز پر شده باشه thread ما منتظر میمونه. بعد از اینکه کارمون هم تموم میشه باید تابع release رو صدا بزنیم تا thread های دیگه ای که منتظر هستند فعالیتشون رو شروع کنن. باید توجه داشته باشید که تابع acquire باعث پرتاب خطای InterruptedException میشه.
- با شی CountDownLatch میتونیم تعداد دفعاتی که یک عمل در چند thread مختلف اجرا میشود را کنترل کرد. این شی در ورودی خودش تعداد دفعاتی که باید اتفاق مورد نظر ما بیوفته رو میگیره. بعد از هر بار اجرای دستور مورد نظر ما باید تابع countDown رو صدا بزنیم، سپس thread مورد نظر رو با فراخوانی تابع await منتظر نگه میداریم تا عمل مورد نظر به تعداد لازم انجام بشه. همچنین تابع await مقداری را به عنوان timeOut دریافت میکند. باید توجه داشته باشید که تابع await باعث پرتاب خطای InterruptedException میشه.
- با اشیای Atomic میتونیم مطمئن بشیم که تغییراتی که در اشیا میدیم به صورت thread safe و look free (بدون نیاز به پیاده سازی lock و synchronized) یکجا انجام میشه.
- با شی Lock میتوانیم فرایند های همزمان را بهتر مدیریت کنیم. باید دقت داشته باشیم که همیشه بعد از هر بار فراخوانی تابع lock باید یک بار هم تابع unlock را فراخوانی کنیم. شی Lock یک interface است و برای استفاده از قابلیت های آن از شی ReentrantLock استفاده کنیم.
- شی ReadWriteLock کاملا مشابه شی Lock است و برای خواندن و نوشتن در فایل استفاده میشود. با این تفاوت که thread هایی که از readLock استفاده میکنند، میتوانند به صورت همزمان از فایل را بخوانند.
+ نوشته شده در دوشنبه ۱۴ تیر ۱۴۰۰ ساعت 8:40 توسط No One