تحتوي فئة الخيط على أساليب Start () و Run (). هذا الفصل سوف يجيب على هذا. يتضمن محتوى هذا الفصل:
وصف الفرق بين Start () و Run ()
مثال على الفرق بين Start () و Run ()
رمز المصدر المتعلق بـ Start () و Run () (استنادًا إلى JDK1.7.0_40)
وصف الفرق بين Start () و Run ()
Start (): وظيفتها هي بدء مؤشر ترابط جديد ، وسيقوم مؤشر الترابط الجديد بتنفيذ طريقة Run () المقابلة. Start () لا يمكن استدعاؤها مرارًا وتكرارًا.
Run (): يمكن استدعاء Run () مرارًا وتكرارًا مثل أساليب الأعضاء العادية. إذا قمت بالاتصال بـ Run () بشكل منفصل ، فسيتم تنفيذ Run () في مؤشر الترابط الحالي ، ولن يتم بدء تشغيل الخيط الجديد!
فيما يلي رمز لشرح.
نسخة الكود كما يلي:
فئة MyThread يمتد الموضوع {
تشغيل الفراغ العام () {
...
}
} ؛
mythread mythread = new MyThread () ؛
يبدأ MyThread.start () مؤشر ترابط جديد ويقوم بتشغيل طريقة Run () في الخيط الجديد.
سيتم تشغيل MyThread.run () طريقة Run () مباشرة في الخيط الحالي ، ولن تبدأ مؤشر ترابط جديد للتشغيل ().
مثال على الفرق بين Start () و Run ()
أدناه ، أظهر الفرق بينهما مع مثال بسيط. رمز المصدر كما يلي:
نسخة الكود كما يلي:
ابدأ الفراغ المزامن العام () {
// إذا لم يكن الموضوع "جاهزًا" ، فسيتم إلقاء استثناء!
إذا (threadstatus! = 0)
رمي جديد غير شرعي readStateException () ؛
// إضافة موضوع إلى ThreadGroup
Group.Add (هذا) ؛
بدأ منطقي = خطأ ؛
يحاول {
// ابدأ الموضوع عبر start0 ()
start0 () ؛
// قم بتعيين علامة البدء
بدأ = صحيح ؛
} أخيراً {
يحاول {
إذا (! بدأ) {
Group.ThreadStartFailed (هذا) ؛
}
} catch (تجاهل رمي) {
}
}
}
نتائج التشغيل:
نسخة الكود كما يلي:
Main Call MyThread.Run ()
الرئيسي هو الجري
Main Call MyThread.start ()
mythread قيد التشغيل
وصف النتائج:
(01) thread.currentTherve (). getName () هو الاسم المستخدم للحصول على "مؤشر الترابط الحالي". يشير مؤشر الترابط الحالي إلى مؤشر الترابط الذي من المقرر تنفيذه في وحدة المعالجة المركزية.
(02) mythread.run () يسمى في "Main Thread Main" ، وتشغيل طريقة Run () مباشرة على "Main Thread Main".
(03) سيبدأ MyThread.Start () "Thread Myther".
رمز المصدر المتعلق بـ Start () و Run () (استنادًا إلى JDK1.7.0_40)
رمز المصدر لطريقة Start () في Thread.java كما يلي:
نسخة الكود كما يلي:
ابدأ الفراغ المزامن العام () {
// إذا لم يكن الموضوع "جاهزًا" ، فسيتم إلقاء استثناء!
إذا (threadstatus! = 0)
رمي جديد غير شرعي readStateException () ؛
// إضافة موضوع إلى ThreadGroup
Group.Add (هذا) ؛
بدأ منطقي = خطأ ؛
يحاول {
// ابدأ الموضوع عبر start0 ()
start0 () ؛
// قم بتعيين علامة البدء
بدأ = صحيح ؛
} أخيراً {
يحاول {
إذا (! بدأ) {
Group.ThreadStartFailed (هذا) ؛
}
} catch (تجاهل رمي) {
}
}
}
ملاحظة: ابدأ () يبدأ في الواقع الخيط من خلال الطريقة المحلية Start0 (). ستقوم Start0 () بتشغيل سلسلة رسائل جديدة ، وسيقوم مؤشر الترابط الجديد باستدعاء طريقة Run ().
نسخة الكود كما يلي:
private native void start0 () ؛
رمز التشغيل () في thread.java كما يلي:
نسخة الكود كما يلي:
تشغيل الفراغ العام () {
إذا (الهدف! = فارغ) {
target.run () ؛
}
}
الوصف: الهدف هو كائن قابل للتشغيل. Run () هو استدعاء طريقة Run () مباشرة للعضو القابل للتشغيل في مؤشر ترابط ، ولن يقوم بإنشاء مؤشر ترابط جديد.