بخشی از پاورپوینت
اسلاید 1 :
برنامه نویسی چندنخی Multi-Thread Programming
اسلاید 2 :
حقوق مؤلف
کلیه حقوق این اثر متعلق به انجمن جاواکاپ است
بازنشر یا تدریس آنچه توسط جاواکاپ و به صورت عمومی منتشر شده است، با ذکر مرجع (جاواکاپ) بلامانع است
اگر این اثر توسط جاواکاپ به صورت عمومی منتشر نشده است و به صورت اختصاصی در اختیار شما یا شرکت شما قرار گرفته، بازنشر آن مجاز نیست
تغییر محتوای این اثر بدون اطلاع و تأیید انجمن جاواکاپ مجاز نیست
اسلاید 3 :
سرفصل مطالب
مفهوم همروندی (Concurrency) و برنامههای همروند
نخ (Thread) و برنامهنویسی چندنخی (Multi-thread)
همزمانی (Synchronization)
حالتهای یک نخ (Thread State)
اسلاید 4 :
مقدمه
اسلاید 5 :
برنامهنویسی ترتیبی
برنامههایی که تا اینجا مینوشتیم، به صورت ترتیبی (sequential) اجرا میشدند
در این برنامهها، دستورات یکی پس از دیگری اجرا میشدند
اما چگونه برنامهای بنویسیم که چند کار را به طور همزمان انجام میدهد؟
چنین برنامههایی چه مخاطراتی دارند و چه نکاتی را باید رعایت کنیم
چه امکاناتی در این زمینه در زبان جاوا تعبیه شده است
فایده: گاهی باید یک برنامه چند کار را همزمان اجرا کند
مثلاً یک آنتیویروس، همزمان با جستجوی ویروس، امکان تعامل با کاربر را داشته باشد
فایده: کامپیوترهای امروزی معمولاً میتوانند چند دستور را همزمان اجرا کنند
اجرای موازی (parallel) و افزایش کارایی
اسلاید 6 :
چندپردازشی، چندنخی
مفهوم چند پردازشی (multi-tasking یا multi-processing):
یعنی سیستمعامل بتواند چند «برنامه» را همزمان اجرا کند
سیستمعاملهای مهم و معمولی این امکان را دارند (ویندوز، لینوکس و .)
مثلاً در ویندوز همزمان با Eclipse میتوانیم Chrome را هم اجرا کنیم
مفهوم چندنخی (multi-thread)
یعنی یک برنامه بتواند چند بخش را به صورت همزمان اجرا کند
هر جریان اجرایی در یک برنامه: یک نخ اجرایی (thread of execution)
مثلاً همزمان با یک متد، متدی دیگری را در اجرا داشته باشد
به همزمانی در اجرای چند بخش، همروندی (concurrency) میگویند
اسلاید 7 :
اجرای موازی و اجرای همروند
مفهوم اجرای موازی (Parallel)
یعنی دو دستور واقعاً همزمان با هم در حال اجرا باشند
مثلاً همزمان که یک پردازنده (CPU) یک متد را اجرا میکند، یک پردازنده دیگر متدی دیگر را اجرا کند
اجرای همروند (concurrency)
یعنی ظاهراً چند بخش همزمان با هم در حال اجرا باشند
چند بخش همزمان در حال پیشرفت هستند
ولی لزوماً به صورت موازی اجرا نمیشوند
شاید در هر لحظه، یکی از این کارها در حال اجرا باشد
اسلاید 8 :
اجرای موازی، اجرای همروند
اسلاید 9 :
همروندی و موازی بودن
CPU
CPU1
CPU2
همروند
همروند و موازی
اسلاید 10 :
پردازشها و نخها
CPU
برنامه چهارم
برنامه دوم
برنامه سوم
برنامه اول
main
run
اسلاید 11 :
مزایای همروندی
همروندی در یک برنامه چه فوایدی دارد؟
افزایش کارایی
مثلاً اگر چند پردازنده و یا چند هسته پردازشی داشته باشیم
کامپیوترهای چندپردازندهای و پردازندههای چندهستهای (مثل core i7)
پیشرفت همزمان چند کار (مثلاً ذخیره و پردازش اطلاعات)
برنامههای پاسخگو (همزمان با پردازش، تعامل با کاربر ممکن است)
حتی بدون امکان اجرای موازی، امکان همروندی برنامه مفید است
اسلاید 12 :
مفهوم نخ (Thread)
اسلاید 13 :
مفهوم نخ (Thread) در برنامهنویسی
وقتی یک برنامه جاوا را اجرا می کنیم:یک نخ (thread) ایجاد میشود که متد main() را اجرا میکند
برنامه میتواند نخهای جدیدی ایجاد کند و سپس آنها را اجرا کند
نخهای مختلف به صورت همروند اجرا میشوند
شاید به صورت موازی
اسلاید 14 :
ایجاد نخ
دو راه اولیه برای تعریف رفتار یک نخ جدید در برنامه وجود دارد
در هر دو راه، کلاس جدیدی میسازیم
1- کلاس جدید زیرکلاس java.lang.Thread باشد
2- کلاس جدید واسط java.lang.Runnable را پیادهسازی کند
متد run را در کلاس جدید پیادهسازی میکنیم
این متد، دستورات نخ (thread) جدید را توصیف میکند
اسلاید 15 :
راه اول
راه اول: ایجاد زیرکلاس Thread
برای ایجاد نخ جدید: یک شیء از این کلاس بسازیم و متد start آن را فراخوانی کنیم
برنامه فوق دو نخ (جریان اجرایی همروند) دارد
یکی Salam و Khodahafez را چاپ میکند و دیگری Hello و Bye
class MyThread extends Thread {
@Override
public void run() {
System.out.println("Hello");
System.out.println("Bye");
}
}
public class ThreadExample{
public static void main(String[] args) {
System.out.println("Salam");
MyThread t = new MyThread();
t.start();
System.out.println("Khodahafez");
}
}
Salam
Khodahafez
Hello
Bye
خروجی محتمل:
Salam
Hello
Khodahafez
Bye
اسلاید 16 :
راه دوم: پیادهسازی واسط Runnable
برای ایجاد نخ جدید: یک شیء (مثلاً با نام r) از این کلاس جدید بسازیم
یک شیء از کلاس Thread بسازیم (مثلاً با نام t) و در سازنده آن r را پاس کنیم
متد start را روی t فراخوانی کنیم
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("Hello");
System.out.println("Bye");
}
}
Thread t = new Thread(new MyRunnable());
t.start();
اسلاید 17 :
دو سؤال
راه اول (زیرکلاس Thread) بهتر است یا راه دوم (پیادهسازی واسط Runnable) ؟
هرچند راه اول پیادهسازی سادهتری دارد
در راه دوم دست طراح بازتر است تا کلاس موردنظر از کلاسی دلخواه ارثبری کند
اگر کلاس ما زیرکلاس Thread باشد نمیتواند از کلاس دیگری ارثبری کند
معمولاً واسط Runnable پیادهسازی میشود
چرا متد run را پیادهسازی میکنیم ولی متد start را فراخوانی میکنیم؟
متد start یک متد خاص در کلاس Thread استکه یک فرایند سطح پایین و سیستمی (ایجاد نخ جدید) را اجرا میکندو در نخ جدید، متد run را صدا میزند
فراخوانی متد run فراخوانی تابعی معمولی است که به ایجاد نخ جدید منجر نمیشود
اسلاید 18 :
امکانات کلاس Thread
اسلاید 19 :
متدهای Thread
برای هر نخی که اجرا میشود، یک شیء از کلاس Thread ساخته شده است
متدهای شیء Thread امکاناتی برای نخ متناظر ارائه میکنند
متدهای کلاس Thread
run, start, getId, setPriority, setDaemon, …
متد استاتیک currentThread : نخ جاری را برمیگرداند
متد استاتیک sleep : نخ جاری مدتی به خواب میرود (اجرای آن به اندازه مشخصی متوقف میشود و سپس ادامه مییابد)
نحوه فراخوانی: sleep(m) یا sleep(m, n)
اجرای این نخ به مدت m میلی ثانیه و n نانوثانیه متوقف میشود
Thread t = Thread.currentThread();
اسلاید 20 :
متد join
گاهی لازم است کار یک نخ تمام شود، تا اجرای یک بخش از کد ادامه یابد
مثلاً نخ «ارسال پیام» متوقف شود تا کار نخ «جستجوی ویروس» تمام شود
یک نخ میتواند تا اتمام یک نخ دیگر منتظر بماند (موقتاً متوقف شود)
این کار با کمک متد join انجام میشود
نکته: متدهای sleep و join ممکن است خطایInterruptedException پرتاب کنند
توضیح بیشتر درباره این خطا در ادامه خواهد آمد
Thread virusScan = new VirusScanThread();
virusScan.start();
prepareEmail();
virusScan.join();
sendEmail();