View Full Version : متد join در thread ها ؟؟
F.zeinali
پنج شنبه 03 اسفند 1391, 20:58 عصر
سلام دوستان
من در چند سایت که تعریف متد join می خوندم به این شکل تعریف کرده بوداند : Thread جاری را مشخص کرده و بعد از اتمام آن ، thread ای که join شده را اجرا می کند .
خوب تعریف که ظاهرا چیزه خاصی نداره !! اما وقتی کد زیر را داشته یاشیم :
public class Join implements Runnable
{
public void run()
{
for (int x = 1; x <= 3; x++)
{
System.out.println("this is thread "+ Thread.currentThread().getName());
}
}
public static void main(String[] args) throws InterruptedException
{
Join j1=new Join();
Thread t1=new Thread(j1,"T1");
Thread t2=new Thread(j1,"T2");
Thread t3=new Thread(j1,"T3");
Thread t4=new Thread(j1,"T4");
t1.start();
t1.join();
t2.start();
t3.start();
t4.start();
}
}
حالا در این کد نحوه اجرا شدن به چه شکل هستش ؟ آیا به این معنی هستش که بعد از اجرا شده t1 به خاطر وجود join ترد t1 دوباره اجرا میش؟
لطفا یک توضیح کامل در این رابطه بدید .
ممنون از کمکتون.
Hybrid
پنج شنبه 03 اسفند 1391, 21:15 عصر
سلام ، حتما میدونید وقتی که برنامه اجرا میشه خود به خود یک Thread ایجاد میشه به نام Main Thread یا همون ترد اصلی برنامه . شما در نمونه برنامتون اومدین 4 Thread رو ایجاد کردین. وقتی که مینویسی t1.join ترد اصلی تا زمانی که این ترد(t1) در حال اجرا بشه در حالت انتظار باقی میمونه تا این ترد بهش ملحق(join) بشه ( در این حالت ممکنه که استثنای InterruptedException پرتاب بشه که مدیریت شده).
پس برنامتون این چنین اجرا میشه : ترد t1 شروع کار میکنه و تا زمانی که به ترد اصلی ملحق میشه اجرا میشه(ترد های دیگه هنوز شروع به کار نکردن) . سپس ترد های t2 , t3 , t4 شروع به کار میکنن. این Thread ها موازی با Thread اصلی اجرا میشن و CPU بر اساس اولویت و فاکتورهای دیگه اجرا میکنه .
this is thread T1
this is thread T1
this is thread T1
this is thread T1
this is thread T2
this is thread T2
this is thread T2
this is thread T3
this is thread T2
this is thread T4
this is thread T3
this is thread T4
this is thread T3
this is thread T4
this is thread T3
this is thread T4
نتیجه کار هم مثل بالا میشه ( البته ممکنه در سیستم شما طور دیگه ای باشه ولی حتما 4 تای اول this is thread T1 هست به خاطر متد join )
pro_mvb
پنج شنبه 03 اسفند 1391, 21:43 عصر
سلام ، حتما میدونید وقتی که برنامه اجرا میشه خود به خود یک Thread ایجاد میشه به نام Main Thread یا همون ترد اصلی برنامه . شما در نمونه برنامتون اومدین 4 Thread رو ایجاد کردین. وقتی که مینویسی t1.join ترد اصلی تا زمانی که این ترد(t1) در حال اجرا بشه در حالت انتظار باقی میمونه تا این ترد بهش ملحق(join) بشه ( در این حالت ممکنه که استثنای InterruptedException پرتاب بشه که مدیریت شده).
پس برنامتون این چنین اجرا میشه : ترد t1 شروع کار میکنه و تا زمانی که به ترد اصلی ملحق میشه اجرا میشه(ترد های دیگه هنوز شروع به کار نکردن) . سپس ترد های t2 , t3 , t4 شروع به کار میکنن. این Thread ها موازی با Thread اصلی اجرا میشن و CPU بر اساس اولویت و فاکتورهای دیگه اجرا میکنه .
نتیجه کار هم مثل بالا میشه ( البته ممکنه در سیستم شما طور دیگه ای باشه ولی حتما 4 تای اول this is thread T1 هست به خاطر متد join )
یعنی شما میگی اول t1 شروع به کار میکنه و 3بار چاپ میشه بعد از اینکه کارش تموم شد t1 به main thread ملحق میشه و باعث میشه 1 بار دیگه اجرا بشه؟
و همچنین یه سوال دیگه خوب مگه thread همزمانی نیست؟ منظورم اینهکه من وقتی میگم t1.start() دیگه منتظر نمیمونم تا کارش به اتمام برسه سریع خط بعد رو اجرا میکنه یعنی t2 و الی آخر .
Hybrid
جمعه 04 اسفند 1391, 00:00 صبح
یعنی شما میگی اول t1 شروع به کار میکنه و 3بار چاپ میشه بعد از اینکه کارش تموم شد t1 به main thread ملحق میشه و باعث میشه 1 بار دیگه اجرا بشه؟
3 بار . وقتی که t1 شروع به کار کرد خوب مگه Thread اصلی هم کار نمیکنه درسته ؟ خوب وقتی که خط t1.start اجرا میشه به خط بعد میره و این خط باعث میشه Main Thread به حالت انتظار بره تا t1 کارش کامل تموم بشه و بهش ملحق بشه . بعدش t2 و الی آخر
و همچنین یه سوال دیگه خوب مگه thread همزمانی نیست؟ منظورم اینهکه من وقتی میگم t1.start() دیگه منتظر نمیمونم تا کارش به اتمام برسه سریع خط بعد رو اجرا میکنه یعنی t2 و الی آخر .
وقتی که Main Thread به حالت انتظار بره چه طور میتونه خط به خط اجرا کنه ؟
نکته ی آخر : وقتی که به t1.join میرسه فعلا خط های بعدی رو اجرا نمیکنه ( چون به حالت انتظار میره ) تا زمانی که اون ترد ( در این مثال t1 ) کارش کامل تموم بشه و سپس ادامه ی خطوط اجرا میشن.
pro_mvb
جمعه 04 اسفند 1391, 11:18 صبح
متوجه شدم ممنون ولی یه سوال کوچیک اونم اینکه این main thread چطوری 1 بار اجرا میشه ؟ یعنی خودش میاد متد run رو صدا میزنه؟ خوب اگه صدا بزنه که باید 3 بار هم اونجا چاپ بشه!
اینجا main thread به نظر من یعنی خود برنامه دیگه ! خوب خوده برنامه هم که فقط یه متد run داره که اینجا جایی صداش نکردن (جزء توو thread های t1 t3 t4 ) پس چطوری به یه بار اجرا میشه؟؟ (ببخشید اگه گیج بازی در میارم)
و در آخر خوب ما به جای Join کردن که منتظر بشه کار thread تموم بشه و بعد شروع به ادامه کار کنه خوب ما از کلاسی که کدامون توشه توی این کلاس new می کنیم ! اینجوری تا وقتی که کارای اون کلاس تموم نشده باشه اینور منتظر میمونه تا اینکه کارای اون کلاس تموم بشه و برگرده دوباره به همین کلاسمون!
F.zeinali
جمعه 04 اسفند 1391, 14:00 عصر
4 بار . وقتی که t1 شروع به کار کرد خوب مگه Thread اصلی هم کار نمیکنه درسته ؟ خوب وقتی که خط t1.start اجرا میشه به خط بعد میره و این خط باعث میشه Main Thread به حالت انتظار بره تا t1 کارش کامل تموم بشه و بهش ملحق بشه . بعدش t2 و الی آخر
وقتی که Main Thread به حالت انتظار بره چه طور میتونه خط به خط اجرا کنه ؟
نکته ی آخر : وقتی که به t1.join میرسه فعلا خط های بعدی رو اجرا نمیکنه ( چون به حالت انتظار میره ) تا زمانی که اون ترد ( در این مثال t1 ) کارش کامل تموم بشه و سپس ادامه ی خطوط اجرا میشن.
طبق گفته های شما من این طور متوجه شدم که 3بار هر کدوم از threadها اجرا میشن و t1 هم 3بار اجرا میشه منتها کار این متد جوین اینه که ترد اصلی وقتی میرسه به t1.join() منتظر میمونه تا t1 کارش تموم بشه
حالا من متوجه نمیشم که شما چرا میگید t1 چهار بار اجرا میشه؟ در واقع باید t1 سه بار چاپ بشه !!
بازم ممنون از راهنمایی تون.
Hybrid
جمعه 04 اسفند 1391, 14:40 عصر
حالا من متوجه نمیشم که شما چرا میگید t1 چهار بار اجرا میشه؟ در واقع باید t1 سه بار چاپ بشه !!
فکر کنم حلقه مورد نظر از 0 تا 3 اجرا میشد ، تغییرش دادین یا من اشتباه دیدم ؟ من فکر کردم از 0 تا 3 اجرا میشه پس اشتباه کردم اگر حلقه از 1 تا 3 اجرا میشه حرفتون درسته . یعنی 3 بار اجرا میشن . موقع تست من بازه را از 0 تا 3 زدم واسه همین هم گفتم 4 بار.
اینجا main thread به نظر من یعنی خود برنامه دیگه ! خوب خوده برنامه هم که فقط یه متد run داره که اینجا جایی صداش نکردن (جزء توو thread های t1 t3 t4 ) پس چطوری به یه بار اجرا میشه؟؟ (ببخشید اگه گیج بازی در میارم)
دوست من Main Thread که نمونه ای از کلاس Join نیست که بخواد پیغام رو چاپ کنه . وقتی که شما برنامه رو استارت میزنید JVM میاد یک Thread رو به طور خودکار ایجاد میکنه تا برنامه شما رو اجرا کنه . همین.
pro_mvb
جمعه 04 اسفند 1391, 14:41 عصر
طبق گفته های شما من این طور متوجه شدم که 3بار هر کدوم از threadها اجرا میشن و t1 هم 3بار اجرا میشه منتها کار این متد جوین اینه که ترد اصلی وقتی میرسه به t1.join() منتظر میمونه تا t1 کارش تموم بشه
حالا من متوجه نمیشم که شما چرا میگید t1 چهار بار اجرا میشه؟ در واقع باید t1 سه بار چاپ بشه !!
بازم ممنون از راهنمایی تون.
دقیقا حرف منم همینه. اگر قرار باشه چاب کنه یعنی باید بره متد run رو اجرا کنه متد run هم که داخلش بری باید 3 بار چاپ کنه.
ادیت شد .....:
متوجه شدم متشکر
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.