یه مشکل اساسی در مفهوم Thread
سلام من در مفهوم Thread به مشکل برخوردم ! یه قانون تو Threadها هستش که اگه Thread والد ازبین بره یا بمیره Threadهای فرزندش هم نابود میشن و دیگه اجرا نمیشن. الان من همین مفهوم رو تو متد Main که خودش یه Thread هست تست کردم ولی به مشکل برخوردم. من یه Exception تو main بوجود میارم قاعدتا نباید تردهام ادامه پیدا کنن. چون من اونهارو join نکردم.
بهتر بخوام بگم من یک متد main دارم که خودش یک Thread هستش و داخل این متد دو Thread به نامهای t1 , t2 ساختم که پنجبار اسم همون Thread رو در خروجی چاپ میکنن. بعد اینکه دو Thread t1 , t2 رو استارت کردم یک Exception در انتهای main توسط 1/0 ایجاد کردم. همون جوری که میدونیم چون اولویت Thread متد main بالاتراز دیگر Threadها هستش اول این Thread به انتها میرسه پس این Exception رخ میده و Thread متد main میمیره یا ازبین میره ولی مشکل اینجاست که هر دو Thread من t1 , t2 تا انتها انجام میشن و بعد برنامه بسته میشه چرا؟ مگه با بسته شدن Thread main نباید دیگر Threadها ازبین برن!؟
public class Main {
public static void main(String[] args) {
Thread t1 = new Thread(){
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName( ));
}
}
};
Thread t2 = new Thread(){
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName( ));
}
}
};
t1.setName("T1");
t2.setName("T2");
t1.start();
t2.start();
System.out.println(1/0);
}
}
نقل قول: یه مشکل اساسی در مفهوم Thread
نقل قول:
یه قانون تو Threadها هستش که اگه Thread والد ازبین بره یا بمیره Threadهای فرزندش هم نابود میشن و دیگه اجرا نمیشن.
فکر میکنم مشکل از این جمله هست. بین thread ها رابطه parent-child برقرار نیست
منبعی برای این جمله دارید؟
نقل قول: یه مشکل اساسی در مفهوم Thread
نقل قول:
نوشته شده توسط
vahid-p
فکر میکنم مشکل از این جمله هست. بین thread ها رابطه parent-child برقرار نیست
منبعی برای این جمله دارید؟
بهتر بود میگفتم من یه قانون برای خودم فرض کردم که بین Threadها یه رابطه paren-child هست درصورتی که اینطور نیست ولی من چرا همچین چیزی گفتم!؟ فرض میکنیم ما یه Thread داریم به نام parent خب حالا دو thread دیگر داریم به نام child1 و child2. حالا من تا زمانی که parent رو استارت نکنم نمیتونم child1 و child2 رو استارت کنم. کلا من یه دیدگاه برای خودم بوجود آوردم که threadی که درون خودش threadهای دیگری داره parent یا والد threadهای درون خودش هست درصورتی که هیچی به اونها ارث نمیده و من کلا منظورم ارث بری نبود. و کلا و قطعا بین threadها رابطه parent-child برقرار نیست. این از این. خب برگردیم به سوال
حالا که منظورم روشن شده بزارید سوالم رو یجور دیگه بپرسم.
یه ترد به نام main ایجاد میکنیم و این thread قراره دو thread دیگه به نام t1 و t2 رو داشته باشه و وظیفه اون به پایان رسوندن این دو thread هست. حالا فرض کنید من main رو استارت کردم و بعد از اون t1 و t2 رو استارت میکنم و بلافاصله یه Exception هم throw میکنم. طبق قائدهای که هست. وقتی که main قبل از به پایان رسوندن وظیفه خودش میمیره پس نباید دو thread .ة t1 و t2 به پایان برسن و برنامه باید بسته بشه مگه اینکه من اشتباه بکنم یه قانون خاصی توی جاوا باشه که من ازش خبر نداشته باشم. لطفا اگه قانون خاصی یا چیزی هست که من ازش خبر ندارم بهم بگید.
نقل قول: یه مشکل اساسی در مفهوم Thread
درسته شروعش در thread اصلی انجام میشه ولی پایانش با پایان thread اصلی نیست. اینجوری فرض کنید که با ایجاد هر thread (هر جایی که شروع شده باشه)، همگی در یک لیست قرار میگیرن (در کنار thread اصلی) و هر کدوم جداگانه در حال اجرا هستند و هر کدام جداگانه میتونن terminate بشن. وقتی که این لیست خالی شد برنامه هم بسته خواهد شد.
تست کردنش هم سادست، میتونید یک ترد درست کنید که چند تا ترد دیگه رو اجرا کنه، همزمان در زمان های مختلف تعداد تردهای درحال اجرا رو بررسی کنید (از Java VisualVM هم میتونید کمک بگیرید که همراه با محیط جاوا روی سیستمتون نصب میشه) و بعضی تردهایی که مثلا ترد دیگری رو اجرا کرده رو terminate کنید با پایان یافتن متد run یا throw exception و ببینید تعدادش به چه صورت خواهد بود.