1. العمليات والموضوعات
1. ما هي العملية؟
التعريف الضيق: العملية هي مثيل لبرنامج الكمبيوتر الذي يتم تنفيذه.
التعريف العام: العملية هي نشاط تشغيل لبرنامج مع بعض وظائف مستقلة فيما يتعلق بمجموعة بيانات معينة. إنها الوحدة الأساسية للتنفيذ الديناميكي لنظام التشغيل. في أنظمة التشغيل التقليدية ، تعد العمليات كل من وحدات التخصيص الأساسية ووحدات التنفيذ الأساسية.
2. ما هو الموضوع؟
المواضيع ، التي تسمى أحيانًا العمليات الخفيفة (LWP) ، هي أصغر وحدات تدفق تنفيذ البرنامج. يتكون مؤشر ترابط قياسي من معرف مؤشر ترابط ، ومؤشر التعليمات الحالي (PC) ، ومجموعة من السجلات ، ومكدس. بالإضافة إلى ذلك ، فإن الخيط هو كيان في العملية وهو الوحدة الأساسية التي يتم جدولةها وإرسالها بشكل مستقل بواسطة النظام. لا يمتلك الخيط نفسه موارد النظام ، ولكن لا يحتوي إلا على عدد قليل من الموارد الأساسية أثناء التشغيل ، ولكن يمكنه مشاركة جميع الموارد التي تملكها العملية مع مؤشرات ترابط أخرى تنتمي إلى نفس العملية.
3. ما هو الفرق بين العملية وخيط؟
الفرق الرئيسي بين العمليات والمواضيع هو أنها طرق مختلفة لإدارة موارد نظام التشغيل.
العملية لديها مساحة عنوان مستقلة. بعد تعطل عملية ما ، لن يؤثر ذلك على العمليات الأخرى في الوضع المحمي ، ومسار تنفيذ مختلف في عملية.
الخيوط لها مكدسها والمتغيرات المحلية الخاصة بها ، ولكن لا توجد مساحة عنوان منفصلة بين المواضيع. إذا مات مؤشر ترابط ، فهذا يعني أن العملية برمتها تموت. لذلك ، فإن البرامج متعددة العمليات أكثر قوة من البرامج متعددة الخيوط ، ولكن عند تبديل العمليات ، تستهلك المزيد من الموارد وأقل كفاءة. ومع ذلك ، بالنسبة لبعض العمليات المتزامنة التي تتطلب عمليات متزامنة تتطلب مشاركة متغيرات معينة ، يمكنها فقط استخدام مؤشرات الترابط ، وليس العمليات.
باختصار ، الفرق بين الخيط والعملية هو:
(1) يحتوي البرنامج على عملية واحدة على الأقل ، وعملية تحتوي على موضوع واحد على الأقل ؛
(2) مقياس تقسيم المواضيع أصغر من عملية العملية ، مما يجعل تزامن البرامج متعددة الخيوط عالية.
(3) تحتوي العملية على وحدات ذاكرة مستقلة أثناء التنفيذ ، وتشارك مؤشرات الترابط المتعددة الذاكرة ، مما يحسن إلى حد كبير كفاءة تشغيل البرنامج.
(4) هناك فرق بين المواضيع والعمليات أثناء التنفيذ. كل مؤشر ترابط مستقل لديه إدخال لتنفيذ البرنامج ، وتسلسل التنفيذ وخروج للبرنامج. ومع ذلك ، لا يمكن تنفيذ مؤشرات الترابط بشكل مستقل ، ويجب أن توجد في التطبيق ، ويتم توفير عناصر تحكم تنفيذ مؤشرات الترابط المتعددة بواسطة التطبيق.
(5) من وجهة نظر منطقية ، يكمن معنى متعدد الخيوط في ذلك في التطبيق ، يمكن تنفيذ أجزاء التنفيذ المتعددة في نفس الوقت. ومع ذلك ، لا يعتبر نظام التشغيل مؤشرات ترابط متعددة كطبقات مستقلة متعددة لتحقيق جدولة العملية وإدارة وتخصيص الموارد.
هذا هو الفرق المهم بين العملية وخيط.
2. دورة حياة الخيط والحالات الأساسية الخمس
خيوط Java لها خمس حالات أساسية:
(1) حالة جديدة (جديدة): عند إنشاء زوج كائن مؤشر الترابط ، فإنه يدخل الحالة الجديدة ، مثل: Thread t = new MyThread () ؛
(2) حالة جاهزة (Runnable): عندما تكون طريقة Start () لكائن مؤشر الترابط (T.Start () ؛) ، يدخل مؤشر الترابط إلى الحالة الجاهزة. مؤشر ترابط في الحالة الجاهزة يعني فقط أن الخيط جاهز وينتظر وحدة المعالجة المركزية لجدولة التنفيذ في أي وقت ، وليس أن مؤشر الترابط سيتم تنفيذه مباشرة بعد تنفيذ T.Start () ؛
(3) حالة التشغيل: عندما تبدأ وحدة المعالجة المركزية في جدولة مؤشرات الترابط في الحالة الجاهزة ، يمكن تنفيذ مؤشر الترابط حقًا ، أي أنه يدخل حالة التشغيل. ملاحظة: الحالة الجاهزة هي الإدخال الوحيد لحالة الجري ، أي إذا أراد مؤشر ترابط الدخول إلى حالة التشغيل للتنفيذ ، فيجب أن يكون أولاً في الحالة الجاهزة ؛
(4) الحالة المحظورة: لسبب ما ، يتخلى مؤشر ترابط في حالة الجري مؤقتًا عن استخدامه لوحدة المعالجة المركزية ويتوقف عن التنفيذ. في هذا الوقت ، يدخل حالة الحجب. لن تتاح لها الفرصة لاستدعاء وحدة المعالجة المركزية مرة أخرى لدخول حالة الجري. وفقًا لأسباب الحجب ، يمكن تقسيم حالات الحظر إلى ثلاثة أنواع:
① في انتظار الحظر: يقوم مؤشر الترابط في حالة التشغيل بتنفيذ طريقة WAIT () لجعل مؤشر الترابط يدخل في انتظار حالة الحظر ؛
② الحظر المتزامن: فشل مؤشر الترابط في الحصول على قفل المزامنة المتزامن (لأن القفل يشغله مؤشرات ترابط أخرى) ، وسيدخل حالة الحجب المتزامنة ؛
③ الحظر الآخر: عند الاتصال بنوم الخيط () أو الانضمام () أو إرسال طلب I/O ، سيدخل الخيط حالة حظر. عندما تم توقيت Sleep () ، انتظرت الانضمام () لإنهاء الخيط أو توقيته ، أو تم الانتهاء من معالجة الإدخال/الإخراج ، حيث تم إعادة إدخال الخيط إلى الحالة الجاهزة.
(5) الحالة الميتة: انتهى الخيط من تنفيذ أو الخروج من طريقة Run () بسبب استثناء ، وينهي الخيط دورة حياته.
3. تنفيذ Java Multithreading
في Java ، إذا كنت ترغب في تنفيذ برنامج متعدد الخيوط ، فيجب عليك الاعتماد على الفئة الرئيسية للخيط (مثل مفهوم الفئة الرئيسية ، والذي يمثل الفئة الرئيسية لخيط) ، ولكن الفئة الرئيسية من هذا الموضوع تحتاج إلى بعض المتطلبات الخاصة عند تحديدها. يمكن لهذه الفئة أن ترث فئة مؤشرات الترابط أو تنفيذ واجهة Runnable لإكمال التعريف.
1. ورث فئة الخيط لتنفيذ متعدد الخيوط
Java.lang.Thread هو فئة مسؤولة عن عمليات الخيوط. يمكن أن يصبح أي فئة الفئة الرئيسية لخيط ما إذا كان يرث فئة الخيط. نظرًا لأنها الفئة الرئيسية ، يجب أن يكون لها طرق الاستخدام الخاصة بها ، والطريقة الرئيسية التي بدأها مؤشر الترابط تحتاج إلى الكتابة فوق طريقة Run () في فئة مؤشر الترابط.
حدد فئة الجسم من الخيط:
فئة MyThread يمتد Thread {// الفئة الرئيسية لعنوان سلسلة الخيط الخاصة ؛ public mythread (tring title) {this.title = title ؛ } Override public void run () {// الطريقة الرئيسية للمعلومات لـ (int x = 0 ؛ x <10 ؛ x ++) {system.out.println (this.title + "run ، x =" + x) ؛ }}}الآن وبعد وجود فئة مؤشرات ترابط وهناك طرق تشغيل مقابلة فيه ، يجب إنشاء الكائن ويجب استدعاء الطرق الداخلية ، لذلك يتم كتابة البرنامج التالي:
الفئة العامة testDemo {public static void main (string [] args) {mythread mt1 = new MyThread ("thread a") ؛ mythread mt2 = new MyThread ("Thread B") ؛ mythread mt3 = new myThread ("thread c") ؛ mt1.run () ؛ mt2.run () ؛ mT3.Run () ؛ }نتائج التشغيل:
الموضوع A يدير ، x = 0
الموضوع A يدير ، x = 1
الموضوع A يدير ، x = 2
الموضوع A يدير ، x = 3
الموضوع A يدير ، x = 4
الموضوع A يدير ، x = 5
الموضوع A يدير ، x = 6
الموضوع A يدير ، x = 7
الموضوع A يدير ، x = 8
الموضوع A يدير ، x = 9
يدير الموضوع B ، x = 0
الموضوع B يعمل ، x = 1
الموضوع B يعمل ، x = 2
الموضوع B يعمل ، x = 3
الموضوع B يعمل ، x = 4
الموضوع B يعمل ، x = 5
الموضوع B يعمل ، x = 6
الموضوع B يعمل ، x = 7
الموضوع B يعمل ، x = 8
الموضوع B يعمل ، x = 9
يعمل الموضوع C ، x = 0
يعمل الموضوع C ، x = 1
يعمل الموضوع C ، x = 2
يعمل الموضوع C ، x = 3
الموضوع C يعمل ، x = 4
الموضوع C يعمل ، x = 5
يعمل الموضوع C ، x = 6
يعمل الموضوع C ، x = 7
يعمل الموضوع C ، x = 8
الموضوع C يعمل ، x = 9
لقد وجدنا أن العمليات المذكورة أعلاه لا تبدأ بالفعل متعددة الخيوط ، لأنه يجب تشغيل تنفيذ مؤشرات ترابط متعددة بالتناوب ، وفي هذا الوقت يتم تنفيذها بالتتابع ، وسيستمر تنفيذ رمز كل كائن لأسفل بعد تنفيذ رمز كل كائن.
إذا كنت ترغب حقًا في البدء متعدد الخيوط في برنامج ما ، فيجب عليك الاعتماد على طريقة فئة مؤشرات الترابط: Public Void Start () ، مما يعني أنك تبدأ بالفعل متعددة الخيوط. بعد استدعاء هذه الطريقة ، سيتم استدعاء طريقة Run () بشكل غير مباشر:
الفئة العامة testDemo {public static void main (string [] args) {mythread mt1 = new MyThread ("thread a") ؛ mythread mt2 = new MyThread ("Thread B") ؛ mythread mt3 = new myThread ("thread c") ؛ mt1.start () ؛ mt2.start () ؛ mt3.start () ؛ }}نتائج التشغيل:
يعمل الموضوع C ، x = 0
الموضوع A يدير ، x = 0
يدير الموضوع B ، x = 0
الموضوع A يدير ، x = 1
يعمل الموضوع C ، x = 1
الموضوع A يدير ، x = 2
الموضوع B يعمل ، x = 1
الموضوع A يدير ، x = 3
الموضوع A يدير ، x = 4
الموضوع A يدير ، x = 5
يعمل الموضوع C ، x = 2
يعمل الموضوع C ، x = 3
الموضوع C يعمل ، x = 4
الموضوع C يعمل ، x = 5
يعمل الموضوع C ، x = 6
يعمل الموضوع C ، x = 7
يعمل الموضوع C ، x = 8
الموضوع C يعمل ، x = 9
الموضوع A يدير ، x = 6
الموضوع A يدير ، x = 7
الموضوع A يدير ، x = 8
الموضوع A يدير ، x = 9
الموضوع B يعمل ، x = 2
الموضوع B يعمل ، x = 3
الموضوع B يعمل ، x = 4
الموضوع B يعمل ، x = 5
الموضوع B يعمل ، x = 6
الموضوع B يعمل ، x = 7
الموضوع B يعمل ، x = 8
الموضوع B يعمل ، x = 9
في هذا الوقت ، يمكنك أن تجد أن سلسلة رسائل متعددة تنفذ بالتناوب مع بعضها البعض ، ولكن نتائج كل تنفيذ مختلفة. من خلال الكود أعلاه ، يمكننا رسم استنتاج: إذا كنت تريد بدء تشغيل مؤشر ترابط ، فيجب عليك الاعتماد على طريقة Start () لفئة مؤشرات الترابط لتنفيذها. بعد بدء تشغيل الخيط ، سيتم استدعاء طريقة Run () افتراضيًا.
بعد استدعاء طريقة START () ، حدثت سلسلة من الأشياء المعقدة:
(1) ابدأ مؤشر ترابط تنفيذ جديد (مع مكدس استدعاء جديد) ؛
(2) يتم نقل الخيط من الحالة الجديدة إلى الحالة القابلة للتشغيل ؛
(3) عندما يحصل مؤشر الترابط على الفرصة للتنفيذ ، سيتم تشغيل طريقة Run () الهدف.
ملاحظة: بالنسبة لـ Java ، فإن طريقة Run () لا يوجد بها شيء خاص. مثل الطريقة الرئيسية () ، فهذا يعني فقط أن الخيط الجديد يعرف اسم الطريقة (وتوقيع) المكالمة. لذلك ، من القانوني استدعاء طريقة التشغيل على Runnable أو Thread ، ولكن لا تبدأ مؤشر ترابط جديد.
Explanation: لماذا يجب عليك استدعاء Start () بدلاً من الاتصال مباشرة () عند بدء تشغيل مؤشر الترابط؟
لقد وجدنا أنه بعد استدعاء Start () ، فإنه ينفذ بالفعل طريقة التجاوز () ، فلماذا لا تتصل بالطريقة Run () مباشرة؟ لشرح هذه المشكلة ، افتح التعليمات البرمجية المصدر لفئة مؤشرات الترابط ومراقبة تعريف طريقة Start ():
start void المزامنة العامة () {if (threadStatus! = 0) رمي جديد alfictThreadStateException () ؛ Group.Add (هذا) ؛ بدأ منطقي = خطأ ؛ حاول {start0 () ؛ بدأ = صحيح ؛ } أخيرًا {try {if (! chation) {group.threadStartFailed (this) ؛ }} catch (تجاهل رمي) {}}} private native void start0 () ؛افتح الكود المصدري لهذه الطريقة وستجد أولاً أن الطريقة ستقوم بإلقاء استثناء "غير شرعي لـ". بشكل عام ، إذا كانت الطريقة تستخدم رميًا لرمي كائن استثناء ، فيجب اكتشاف هذا الاستثناء باستخدام Try ... catch ، أو ألقيت باستخدام رميات على إعلان الطريقة ، ولكن لا يوجد شيء في هذا المجال. لماذا؟ لأن فئة الاستثناء هذه تنتمي إلى فئة فرعية من استثناء وقت التشغيل (RunTimeException):
java.lang.Object
|- java.lang.Throwable
|- java.lang.Exception
|- java.lang.runtimeexception
|- java.lang.illegalargumentException
|- java.lang.illegalthreadStateException
سيتم طرح هذا الاستثناء عند بدء تشغيل كائن مؤشر ترابط بشكل متكرر ، أي أنه لا يمكن بدء كائن مؤشر ترابط إلا مرة واحدة.
أحد الأجزاء الأكثر أهمية في طريقة Start () هي طريقة Start0 () ، وهذه الطريقة تستخدم تعريف الكلمة الرئيسية الأصلية.
تشير الكلمة الرئيسية الأصلية إلى واجهة Java الأصلية ، أي أن Java يستخدم لاستدعاء وظائف نظام التشغيل الأصلي لإكمال بعض العمليات الخاصة. نادراً ما يُرى تطوير الكود هذا في جافا لأن أكبر ميزة في جافا هي قابلية النقل. إذا كان لا يمكن استخدام البرنامج إلا على نظام تشغيل ثابت ، فسيتم فقدان قابلية النقل تمامًا ، لذلك لا يتم استخدام هذه العملية عمومًا.
يجب أن يتطلب تنفيذ MultiThreading دعم نظام التشغيل. ثم فإن طريقة Start0 () أعلاه تشبه في الواقع طريقة التجريد بدون هيئة طريقة. يتم تسليم هيئة الطريقة هذه إلى JVM لتنفيذها ، أي أن JVM في Windows قد يستخدم طريقة A لتنفيذ Start0 () ، في حين أن JVM في Linux قد تستخدم طريقة B لتنفيذ Start0 () ، ولكن عند الاتصال ، لن يهتم بالطريقة المحددة لتنفيذ طريقة Start0 () ، ولكنها تهتم فقط بنتيجة التشغيل النهائية ، واليد التي يتم توسيعها إلى JVM لتطابقها.
لذلك ، في العمليات متعددة الخيوط ، يتطلب استخدام طريقة Start () لبدء عمليات متعددة الخيوط مكالمات وظائف نظام التشغيل.
2. تنفيذ الواجهة القابلة للتشغيل لتنفيذ متعدد الخيوط
يمكن أن يؤدي استخدام فئة الخيوط بالفعل إلى تسهيل التنفيذ متعدد الخيوط ، ولكن العيب الأكبر لهذه الطريقة هو مشكلة الميراث الفردي. تحقيقًا لهذه الغاية ، يمكن أيضًا استخدام واجهة Runnable في Java لتنفيذ متعدد الخيوط. تعريف هذه الواجهة كما يلي:
الواجهة العامة Runnable {public void run () ؛}تنفيذ متعدد الخيوط من خلال الواجهة القابلة للتشغيل:
Class MyThread تنفذ Runnable {// عنوان السلسلة الخاصة بالفئة الرئيسية للموضوع ؛ public mythread (tring title) {this.title = title ؛ } Override public void run () {// الطريقة الرئيسية للمعلومات لـ (int x = 0 ؛ x <10 ؛ x ++) {system.out.println (this.title + "run ، x =" + x) ؛ }}}هذا لا يختلف كثيرًا عن الطريقة السابقة لورث فئات الخيوط ، ولكن ميزة واحدة هي أنه يتجنب الحد من الميراث الفردي.
لكن المشكلة هنا. كما ذكرنا من قبل ، إذا كنت ترغب في بدء تشغيل متعدد الخيوط ، فأنت بحاجة إلى الاعتماد على طريقة Start () لفئة الخيط. عندما ترث فئة الخيط ، يمكنك أن ترث هذه الطريقة مباشرة واستخدامها. لكنك الآن تقوم بتنفيذ الواجهة القابلة للتشغيل. بدون هذه الطريقة ، يمكنك أن ترثها. ماذا يجب أن تفعل؟
لحل هذه المشكلة ، لا تزال بحاجة إلى الاعتماد على فئة الخيط لإكمالها. يتم تعريف مُنشئ في فئة مؤشرات الترابط لتلقي كائن الواجهة القابل للتشغيل:
الموضوع العام (الهدف القابل للتشغيل) ؛
ابدأ قراءة MultiThreading باستخدام فئة الخيوط:
الطبقة العامة testDemo {public static void main (string [] args) يلقي الاستثناء {mythread mt1 = new MyThread ("thread a") ؛ mythread mt2 = new MyThread ("Thread B") ؛ mythread mt3 = new myThread ("thread c") ؛ موضوع جديد (MT1) .start () ؛ موضوع جديد (MT2) .start () ؛ موضوع جديد (MT3) .start () ؛ }}نتائج التشغيل:
الموضوع A يدير ، x = 0
يدير الموضوع B ، x = 0
الموضوع B يعمل ، x = 1
يعمل الموضوع C ، x = 0
الموضوع B يعمل ، x = 2
الموضوع A يدير ، x = 1
الموضوع B يعمل ، x = 3
يعمل الموضوع C ، x = 1
يعمل الموضوع C ، x = 2
الموضوع B يعمل ، x = 4
الموضوع B يعمل ، x = 5
الموضوع A يدير ، x = 2
الموضوع A يدير ، x = 3
الموضوع A يدير ، x = 4
الموضوع A يدير ، x = 5
الموضوع A يدير ، x = 6
الموضوع A يدير ، x = 7
الموضوع A يدير ، x = 8
الموضوع A يدير ، x = 9
الموضوع B يعمل ، x = 6
الموضوع B يعمل ، x = 7
الموضوع B يعمل ، x = 8
الموضوع B يعمل ، x = 9
يعمل الموضوع C ، x = 3
الموضوع C يعمل ، x = 4
الموضوع C يعمل ، x = 5
يعمل الموضوع C ، x = 6
يعمل الموضوع C ، x = 7
يعمل الموضوع C ، x = 8
الموضوع C يعمل ، x = 9
في هذا الوقت ، لا يتم تحقيق بدء تشغيل متعدد الخيوط فحسب ، بل يتم أيضًا عدم وجود قيود على الميراث.
3. الطريقة الثالثة لتنفيذ متعدد الخيوط: استخدم الواجهة القابلة للاتصال لتنفيذ متعدد الخيوط
يمكن أن يتجنب MultiThreading باستخدام الواجهة القابلة للتشغيل الحد من الميراث الفردي ، ولكن هناك مشكلة لا يمكن أن تعيد طريقة Run () في الواجهة القابلة للتشغيل نتيجة العملية. لحل هذه المشكلة ، يتم توفير واجهة جديدة: الواجهة القابلة للاتصال (java.util.concurrent.callable).
الواجهة العامة قابلة للاتصال <v> {public v call () رمي الاستثناء ؛}بعد تنفيذ طريقة الاتصال () في الواجهة القابلة للاتصال ، سيتم إرجاع نتيجة. يتم تحديد نوع النتيجة التي تم إرجاعها بواسطة الأدوية الجيرية على الواجهة القابلة للاتصال.
التشغيل المحدد لتنفيذ الواجهة القابلة للاتصال لتنفيذ متعدد الخيوط هو:
إنشاء فئة تنفيذ للواجهة القابلة للاتصال وتنفيذ طريقة CLALL () ؛ ثم استخدم فئة FutureTask لالتفاف كائن فئة التنفيذ القابلة للاتصال ، واستخدم كائن FutureTask هذا كهدف لكائن مؤشر الترابط لإنشاء مؤشر ترابط.
تحديد فئة الجسم الخيط:
استيراد java.util.concurrent.callable ؛ class mythread تنفذ قابلة للاتصال <string> {private int ticket = 10 ؛ Override Public String Call () يلقي الاستثناء {for (int i = 0 ؛ i <20 ؛ i ++) {if (this.ticket> 0) {system.out.println ("تذاكر بيع ، العدد المتبقي من الأصوات هو"+this.ticket -) ؛ }} الإرجاع "تم بيع التذاكر" ؛ }}لا تدعم فئة الموضوع مباشرة الواجهة القابلة للاتصال. بعد JDK1.5 ، يتم توفير الفصل:
java.util.concurrent.futureTask <V>
هذه الفئة مسؤولة بشكل أساسي عن تشغيل كائن الواجهة القابل للاتصال. بنية التعريف الخاصة بها هي كما يلي:
فئة FutureTask <v>
يمتد الكائن
تنفذ runnablefurture <v>
تحتوي واجهة RunNableFurture على التعريف التالي:
الواجهة العامة RunNableFurture <V>
يمتد Runnable ، المستقبل <v>
يتم تعريف المنشئ التالي في فئة FutureTask:
مقاس مستقبلي عام (قابل للاتصال <v> قابل للاتصال)
الآن ، يمكنك أخيرًا تلقي كائن الواجهة القابل للاتصال من خلال فئة FutureTask. الغرض من تلقي هو الحصول على نتيجة الإرجاع لطريقة الاتصال ().
من التحليل أعلاه يمكننا أن نجد:
يمكن أن تتلقى فئة FutureTask كائنات واجهة قابلة للاتصال ، وتنفي فئة FutureTask واجهة RunNableFurture ، التي ترث الواجهة القابلة للتشغيل.
لذلك ، يمكننا أن نبدأ في القراءة المتعددة مثل هذا:
الطبقة العامة testDemo {public static void main (string [] args) يلقي الاستثناء {mythread mt1 = new MyThread () ؛ mythread mt2 = new MyThread () ؛ FutureTask <String> Task1 = New FutureTask <String> (MT1) ؛ // Get Call () طريقة لإرجاع Result FutureTask <String> tasc2 = جديد FutureTask <string> (MT2) ؛ // Get Call () طريقة لإرجاع النتيجة // FutureTask هي فلة فرعية للواجهة القابلة للتشغيل. يمكنك استخدام إنشاء فئة مؤشرات الترابط لتلقي كائنات المهمة مؤشر ترابط جديد (Task1) .start () ؛ موضوع جديد (Task2) .start () ؛ // بعد الانتهاء من تنفيذ Multithread ، يمكنك استخدام طريقة GET () في واجهة الواجهة الوالدية في FutureTask للحصول على نظام نتائج التنفيذ. System.out.println ("Thread 2's Return Return:"+task2.get ()) ؛ }}نتائج التشغيل:
بيع التذاكر ، العدد المتبقي من الأصوات هو 10
بيع التذاكر ، العدد المتبقي من الأصوات هو 10
بيع التذاكر ، والرقم المتبقي من الأصوات هو 9
بيع التذاكر ، والرقم المتبقي من الأصوات هو 8
بيع التذاكر ، والرقم المتبقي من الأصوات هو 7
بيع التذاكر ، والرقم المتبقي من الأصوات هو 9
بيع التذاكر ، العدد المتبقي من الأصوات هو 6
بيع التذاكر ، والرقم المتبقي من الأصوات هو 8
بيع التذاكر ، والرقم المتبقي من الأصوات هو 5
بيع التذاكر ، والرقم المتبقي من الأصوات هو 7
بيع التذاكر ، والرقم المتبقي من الأصوات هو 4
بيع التذاكر ، العدد المتبقي من الأصوات هو 6
بيع التذاكر ، والرقم المتبقي من الأصوات هو 3
بيع التذاكر ، والرقم المتبقي من الأصوات هو 5
بيع التذاكر ، والرقم المتبقي من الأصوات 2
بيع التذاكر ، والرقم المتبقي من الأصوات هو 4
بيع التذاكر ، والرقم المتبقي من الأصوات هو 1
بيع التذاكر ، والرقم المتبقي من الأصوات هو 3
بيع التذاكر ، والرقم المتبقي من الأصوات 2
بيع التذاكر ، والرقم المتبقي من الأصوات هو 1
نتيجة العودة للموضوع 1: تم بيع التذكرة. نتيجة العودة للموضوع 2: تم بيع التذكرة.
ملخص:
ما ورد أعلاه يشرح ثلاث طرق لتنفيذ MultiThreading. لبدء تشغيل مؤشر الترابط ، يطلق عليها جميعها طريقة Start () لكائن مؤشر الترابط. من المهم أن نلاحظ أنه لا يمكن استدعاء طريقة Start () مرتين على نفس كائن الخيط.