فاضل فرنیا
فاضل فرنیا
خواندن ۱ دقیقه·۵ سال پیش

تفاوت sleep،wait،interrupt در thread

تو زبان برنامه نویسی جاوا مبحث thread ها و مدیریت همزمانی و همروندی اونا با یه سری متدها سر و کار داریم که بعضی وقتا لازمه thread هایی که همزمان به منابع مشترک دسترسی دارن یا به نحوی چندتاشون میخوان رو یه آبجکت در یک لحظه state اون آبجکت رو عوض کنن، بصورت دستی مدیریت و کنترل شن. متدهای ذکر شده اساسا برای ایجاد وقفه در thread ها استفاده میشه که حالا تفاوتای ریزی داره که میگم.

متد sleep بر روی هر thread اگر اجرا بشه بر اساس پارامتر ورودی به میلی ثانیه اون thread متوقف شده و اجازه میده بقیه thread ها اجرا بشن و بعد از اتمام زمان تعیین شده دوباره اجرا می شه. بعضا بدرد جاهایی میخوره که میخوایم یه کار بصورت دوره های زمانی مشخص مثلا هر یک ساعت یبار اجرا شه.

متد wait هم کاراییش مثه sleep میمونه با این تفاوت که اگر یک thread روی یک آبجکت که synchronized شده wait رو صدا بزنیم همینجوری منتظر میمونه تا اینکه یه thread دیگه روی همون آبجکت متد notify را صدا بزنه تا آزاد شه. بعضی وقتا هم جایی که برنامه قراره تموم شه محض احتیاط notifyAll رو صدا میزنن تا همه wait ها آزاد شن.

متد interrupt هم کارش مثه بالاییاس باعث ایجاد وقفه در thread میشه با این تفاوت که state یک thread رو به حالت interrupted میبره که در واقع یه flag رو true می کنه. حالا اگه یه thread رو ما interrupt کنیم یعنی flag مورد نظر براش true باشه دو حالت ممکنه بوجود بیاد اگر اون thread که interrupted هست در حالت sleep باشه و یا در جایی از اجرای آن از sleep استفاده شده باشد به محض رسیدن به حالت sleep یه InterruptedException پرتاب خواهد کرد و اگر در هیچ جای آن thread از sleep استفاده نشده باشد فقط flag تغییر کرده.

جاواjavaThread
توسعه دهنده نرم افزار، دوستدار هنر علی الخصوص سینما و تئاتر، طبیعتگرد و عکاس
شاید از این پست‌ها خوشتان بیاید