مترابطة ومتعددة الخيوط وبركة موضوع مفصل

العمليات والخيوط

  • عملية : يتم تنفيذ عملية البرنامج.

  • خيط : هو مسار تنفيذ البرنامج، يمكن أن تحتوي على العملية مواضيع متعددة.

    فهم الشعبية: على سبيل المثال، يمكنك فتح بريد إلكتروني الصغير هو فتح العملية التي دردشة الرسائل الصغرى والأصدقاء الفيديو لفتح الموضوع.

  • العلاقة بين البلدين :

    والعملية التي يمكن أن يكون لها مواضيع متعددة، هناك موضوع واحد على الأقل.

    خيط من عملية من شأنها أن تكون فيه.

شرح العمليات والخيوط على هذا المقال يتحدث جيدة جدا - > وهناك تفسير بسيط للعمليات والمواضيع

ثلاث طرق لإنشاء المواضيع

أولا، والميراث الموضوع

1، وتعريف فئة الميراث MyThread الموضوع، وتجاوز أسلوب التشغيل.

2، كتابة التعليمات البرمجية ليتم تنفيذها في طريقة التشغيل.

3، إنشاء مثيل من فئة، واستدعاء الأسلوب البدء () لفتح الموضوع.

كود هي كما يلي:

الطبقة العامة MainActivity يمتد AppCompatActivity { خاص سلسلة TAG النهائي = this.getClass () getSimpleName ()؛ Override محمية باطلة OnCreate الخاص (حزمة savedInstanceState) { super.onCreate (savedInstanceState)؛ setContentView (R.layout.activity_main)؛ // 3، إنشاء مثيل من فئة، واستدعاء الأسلوب البدء () لفتح الموضوع. MyThread myThread = MyThread جديد ()؛ myThread.start ()؛} // 1، وتعريف فئة MyThread رثت الموضوع، وتجاوز طريقة التشغيل. الطبقة MyThread يمتد الموضوع { المدى باطلة العامة () { // 2، كتابة التعليمات البرمجية ليتم تنفيذها في طريقة التشغيل. ل(كثافة العمليات ط = 0؛ ط <  100، وأنا ++) { Log.d (TAG، "اسم الموضوع:" + Thread.currentThread () getName () + "ط =" + ط)؛ } } } }

ثانيا، تنفيذ Runnable

1، وتعريف فئة MyRunnable تنفيذ Runnable، وتجاوز أسلوب التشغيل.

2، كتابة التعليمات البرمجية ليتم تنفيذها في طريقة التشغيل.

3 إنشاء كائن الموضوع، ويمر في حالات MyRunnable ويستدعي الأسلوب البدء () لفتح الموضوع.

كود هي كما يلي:

الطبقة العامة MainActivity يمتد AppCompatActivity { خاص سلسلة TAG النهائي = this.getClass () getSimpleName ()؛ Override محمية باطلة OnCreate الخاص (حزمة savedInstanceState) { super.onCreate (savedInstanceState)؛ setContentView (R.layout.activity_main)؛ // 3، إنشاء كائن الموضوع، ويمر في حالات MyRunnable ويستدعي الأسلوب البدء () لفتح الموضوع. الموضوع = new الموضوع (MyRunnable الجديدة ())؛ thread.start ()؛ } // 1، يحدد فئة MyRunnable تنفيذ Runnable، وتجاوز أسلوب التشغيل. الطبقة MyRunnable الأدوات Runnable { المدى باطلة العامة () { // 2، كتابة التعليمات البرمجية ليتم تنفيذها في طريقة التشغيل. ل(كثافة العمليات ط = 0؛ ط <  100، وأنا ++) { Log.d (TAG، "اسم الموضوع:" + Thread.currentThread () getName () + "ط =" + ط)؛ } } } }

ثالثا، لتحقيق للاستدعاء واجهة

واجهة للاستدعاء مشابهة لRunnable، للاستدعاء واجهة تطبيق فئة تنفيذ المهام هي من الدرجة Runnable التي يمكن أن يقوم بها المواضيع الأخرى.

1، فئة مخصصة MyCallable تنفيذ واجهة للاستدعاء ودعوة تجاوز الأسلوب ()

2، كتابة التعليمات البرمجية ليتم تنفيذها في المكالمة () طريقة

3 إنشاء كائن ترابط التجمع، دعوة تقدم () ينفذ طريقة مهمة MyCallable وإرجاع المستقبل الكائن

بعد قيمة 4، استدعاء الأسلوب الكائن المستقبل في الحصول على () للحصول على المكالمة () طريقة لأداء

كود هي كما يلي:

الطبقة العامة MainActivity يمتد AppCompatActivity { خاص سلسلة TAG النهائي = this.getClass () getSimpleName ()؛ Override محمية باطلة OnCreate الخاص (حزمة savedInstanceState) { super.onCreate (savedInstanceState)؛ setContentView (R.layout.activity_main)؛ // 3، إنشاء كائن ترابط التجمع، دعوة تقدم () ينفذ طريقة مهمة MyCallable وإرجاع المستقبل الكائن تجمع ExecutorService = Executors.newSingleThreadExecutor ()؛ مستقبل < عدد صحيح >  F1 = pool.submit (MyCallable الجديدة ())؛ // 4، استدعاء الأسلوب الكائن المستقبل في الحصول على () للحصول على المكالمة () قيمة الأسلوب بعد تنفيذ محاولة { Log.d (TAG، "المبلغ =" + f1.get ())؛ } صيد (InterruptedException ه) { e.printStackTrace ()؛ } صيد (ExecutionException ه) { e.printStackTrace ()؛ } // وثيقة تجمع مؤشرات الترابط pool.shutdown ()؛ } // 1، فئة مخصصة MyCallable تنفيذ واجهة للاستدعاء ودعوة تجاوز الأسلوب () الطبقة العامة تنفذ MyCallable للاستدعاء < عدد صحيح >  { صحيح دعوةOverride الجمهور () رميات استثناء { // 2، كتابة التعليمات البرمجية ليتم تنفيذها في المكالمة () طريقة مبلغ كثافة العمليات = 0؛ ل(كثافة العمليات ط = 0؛ ط < = 100؛ ط ++) { المبلغ + = ط. } العودة المبلغ. } } }

مقارنة بين ثلاث طرق لإنشاء موضوع

أولا، والفرق بين الميراث الطبقة الموضوع وتنفيذ Runnable

ونحن نعلم جميعا أن دعم جافا الميراث واحد، تنفيذ. تنفيذ ويمكن أيضا أن ترث من الفئات الأخرى اجهة Runnable، ولكن لا يمكنك استخدام يرث وراثة فئة الموضوع الآخر. حتى عندما كنت ترغب في إنشاء موضوع والأمل الميراث فيما يتعلق الطبقات الأخرى، عند اختيار تنفيذ Runnable.

ثانيا، ندرك الفرق للاستدعاء واجهة واجهة Runnable

يتم تنفيذ طريقة الدعوة للاستدعاء ()، ويتم تنفيذ طريقة تشغيل Runnable ().

دعوة () إرجاع الأسلوب قيمة يمكن أيضا بطرح استثناء، طريقة تشغيل () ليست لا قيمة العائد لا يمكن رمي استثناء.

خاصية تعدد

أولا، مفهوم

عملية لفتح أكثر من موضوع واحد.

الثانية، ومزايا وعيوب متعددة الخيوط

  • ميزة

    1، لتحسين استخدام وحدة المعالجة المركزية

    على سبيل المثال دائرة الأصدقاء الصور التي نشرت عند تحميل الصور تسعة عندما فتحت بطريقة متزامنة إذا كان موضوع مع صور تحميل صورة، على افتراض أن كل موضوع تحميل الصور يستغرق سوى موارد وحدة المعالجة المركزية 1 يوميا، والباقي 99 إهدار الموارد. ولكن إذا قمت بفتح تسعة المواضيع في وقت واحد تحميل الصور، وحدة المعالجة المركزية إلى 9 من الموارد لاستخدامها.

    2، وتحسين كفاءة البرنامج

    أو التقاط الصور من الأصدقاء، وإذا رفع موضوع مفتوح صورة 1 ثانية، ثم بطريقة متزامنة سوف تحتاج إلى تحميل تسعة تسع ثوان، ولكن يمكنك فتح تسعة المواضيع في وقت واحد تحميل الصور، ثم ما عليك سوى أن العدد 1 ثانية لإكمال.

  • عيب

    1، إذا كان هناك عدد كبير من المواضيع يمكن أن تؤثر على الأداء لأن وحدة المعالجة المركزية تحتاج إلى التبديل بينهما.

    2، والمزيد من المواضيع تتطلب المزيد من مساحة الذاكرة.

    قد العمليات 3، متعددة الخيوط موضوع آمنة أو مشاكل الجمود.

الثالث، وبالتوازي مع متعددة الخيوط والفرق المتزامنة

  • مفهوم

    موازية: تعدد المعالجات أو معالجات متعددة النواة أداء في وقت واحد وافر من المهام المختلفة.

    التوافق: معالج للتعامل مع مهام متعددة.

  • تشابه جزئي

    وبالتوازي مع رجل بيده اليسرى لإطعامها لتناول الطعام، ولكن أن يأكل بيمينه لإطعام ابنه.

    التزامن هو ابنة الناس Chiyikoufan الحصول على الطعام، ثم تغذية ابنه لدغة، ومن ثم تغذية لها لدغة، يتناوبون تغذية.

  • على سبيل المثال، متعددة الخيوط العاملة تظهر نفس البيانات ذات ألوان

    تحميل مولتيثريد 9 صور، غادرت النصائح ولم تقم بتحميل بعض الصور. كود هي كما يلي:

الطبقة العامة MainActivity يمتد AppCompatActivity { خاص سلسلة TAG النهائي = this.getClass () getSimpleName ()؛ Override محمية باطلة OnCreate الخاص (حزمة savedInstanceState) { super.onCreate (savedInstanceState)؛ setContentView (R.layout.activity_main)؛ // مفتوحة خيطين تحميل الصور MyRunnable myRunnable = MyRunnable جديدة ()؛ . موضوع جديد (myRunnable "الموضوع 1") بدء ()؛ جديد الموضوع (myRunnable "الموضوع 2") بدء ()؛.} الطبقة العامة تنفذ MyRunnable Runnable { خاصة الباحث imgNum = 9؛ // عدد من الصور Override المدى باطلة العامة () { بينما (صحيح) { إذا (imgNum == 0) { كسر. } محاولة { Thread.sleep (1000)؛ // تحميل محاكاة صورة تتطلب 1 ثانية } صيد (InterruptedException ه) { e.printStackTrace ()؛ } Log.d (. TAG، Thread.currentThread () getName () + "صورة تحميل ...، غادر" + imgNum-- + "لم تحميل الصور")؛ } } } }

النتائج المطبوعة هي كما يلي:

ويبين الشكل ظهر عدد من الصور السلبية، خطأ واضح.

السبب:

والسبب في هذا الخطأ هو أن هناك مواضيع متعددة البيانات المشتركة العاملة. هذا هو موضوع لتبادل البيانات أثناء تشغيل وحدة المعالجة المركزية والتحول إلى موضوع آخر للعمل على البيانات، وهو ما يسمى متعددة الخيوط.

الحل:

من جانب تزامن البيانات متاحة التلاعب مع متزامنة، حتى نتمكن من ضمان في نفس الوقت، فقط الوصول علبة موضوع واحد.

كود هي كما يلي:

الطبقة العامة MainActivity يمتد AppCompatActivity { خاص سلسلة TAG النهائي = this.getClass () getSimpleName ()؛ Override محمية باطلة OnCreate الخاص (حزمة savedInstanceState) { super.onCreate (savedInstanceState)؛ setContentView (R.layout.activity_main)؛ // مفتوحة خيطين تحميل الصور MyRunnable myRunnable = MyRunnable جديدة ()؛ . موضوع جديد (myRunnable "الموضوع 1") بدء ()؛ . موضوع جديد (myRunnable "الموضوع 2") بدء ()؛ } الطبقة العامة تنفذ MyRunnable Runnable { خاصة الباحث imgNum = 9؛ // عدد من الصور Override المدى باطلة العامة () { بينما (صحيح) { تزامن (MyRunnable.class) { // إضافة مزامنة متزامنة، في نفس الوقت للتأكد من أن مؤشر واحد فقط الوصول العلبة. إذا (imgNum == 0) { كسر. } محاولة { Thread.sleep (1000)؛ // تحميل محاكاة صورة تتطلب 1 ثانية } صيد (InterruptedException ه) { e.printStackTrace ()؛ } Log.d (. TAG، Thread.currentThread () getName () + "صورة تحميل ...، غادر" + imgNum-- + "لم تحميل الصور")؛ } } } } }

النتائج المطبوعة هي كما يلي:

كاتب الموضوع بركة

تجمع موضوع وشك

خاصية تعدد الأمثلة السابقة استشهد نشر الصور من الأصدقاء، من أجل تحسين كفاءة استخدام وحدة المعالجة المركزية والبرنامج الذي تحتاجه لإنشاء تسعة المواضيع لتحميل الصور. ولكن خلق موضوع والدمار وحدة المعالجة المركزية مكثفة جدا والذاكرة، حيث صلته تريد التفاعل مع نظام التشغيل. وهذا قد يؤدي إلى خلق وتدمير المواضيع النفقات أكبر من العمل الفعلي، ولكن تجمع موضوع يمكن أن يكون حلا جيدا لهذه المشاكل. بعد نهاية كل موضوع في حوض السباحة، وليس تدمير (التدمير يمكن أن يحدد مهلة)، لكنه عاد إلى تجمع مؤشرات الترابط يصبح خاملا، في انتظار الكائن التالي الاستخدام.

وميزة استخدام المسبح موضوع

1، للحد من الخلق والدمار الذي سببته النفقات العامة الأداء الموضوع.

2، ويمكن السيطرة على أكبر عدد ممكن من المواضيع المتزامنة، لتجنب المنافسة المفرطة للموارد وقضية تستهلك ذاكرة النظام.

3، وفتح الانتعاش وتحسين السيطرة على الموضوع، ويمكن جدولة المهمة.

عدة مهمة الطبقة ترابط التجمع

  • المنفذ : جافا موضوع مجموعة من واجهة المستوى الأعلى، يمكنك يطلق عليه المحرك واحد، من خلال النظر في شفرة المصدر أيضا أعرف أنه مجرد وسيلة بسيطة لتنفيذ (القيادة Runnable)، ويتم استخدامها لتنفيذ مهمة المقدمة. المصدر على النحو التالي:

    [Executor.java]

الواجهة العمومية المنفذ {باطلا تنفيذ (القيادة Runnable)؛}
  • ExecutorService : فئة فرعية المنفذ الصحيح أيضا واجهة تجمع الموضوع. ويوفر تقديم عمل وثيقة تجمع مؤشرات الترابط وغيرها من الأساليب. استدعاء تقديم الطريقة يمكن أيضا إرجاع مهمة لتقديم وجوه المستقبل التي الكائن يمكن أن نفهم تنفيذ ولاية، والحصول على نتيجة تنفيذ المهمة أو إلغاء المهمة.

  • منفذي : كما تجمع مؤشرات الترابط هو معقد بعض الشيء لتكوين تجمع مؤشرات الترابط الخاصة بهم قد لا يكون أفضل أداء. يستخدم منفذي بسهولة لخلق مجموعة متنوعة من الأدوات التي تستخدم عادة في التجمع الموضوع.

  • ThreadPoolExecutor : تطبيق الافتراضي ExecutorService والمنفذين خلق مجموعة متنوعة من تجمع الصفحات الداخلية، في حين أن يدعو منشئ ThreadPoolExecutor. المصادقة التالية من خلال النظر في شفرة المصدر.

    على سبيل المثال، مجرد إنشاء تجمع الموضوع:

ExecutorService newCachedThreadPool = Executors.newCachedThreadPool ()؛

انقر newCachedThreadPool () في الذي يدعو حقا ThreadPoolExecutor منشئ، على النحو التالي:

[Executor.java]

 ساكنة العام ExecutorService newCachedThreadPool () { العودة ThreadPoolExecutor الجديدة (0، Integer.MAX_VALUE، 60L، TimeUnit.SECONDS، SynchronousQueue جديدة < Runnable > ())؛ }

وصف المعلمات منشئ ThreadPoolExecutor

هنا تأخذ معلمة من المصدر إلى شرح الأكثر اكتمالا، على النحو التالي:

[ThreadPoolExecutor.java]

 الجمهور ThreadPoolExecutor (الباحث corePoolSize، الباحث maximumPoolSize، طويلة keepAliveTime، وحدة TIMEUNIT، BlockingQueue < Runnable >  workQueue، ThreadFactory threadFactory، RejectedExecutionHandler معالج) { }
  • corePoolSize : عدد الأساسية من المواضيع، إذا كان عدد المواضيع تشغيل أقل من corePoolSize، عندما تأتي مهام جديدة مع مرور الوقت سوف إنشاء موضوع جديد لتنفيذ هذه المهمة، حتى لو كانت هناك أخرى المواضيع الخمول تجمع الموضوع.

  • maximumPoolSize : يسمح الحد الأقصى لعدد المواضيع في التجمع الموضوع.

  • keepAliveTime : إذا كان عدد من المواضيع من عدد الأساسية من المواضيع، ثم هذه المواضيع إضافية إذا سيتم إنهاء الخمول لأكثر من keepAliveTime.

  • وحدة : وحدة دوام المعلمات keepAliveTime.

  • workQueue : طابور العمل، من خلال الطريقة سيتم تنفيذ تجمع التخزين موضوع Runnable المهمة في قائمة الانتظار.

  • threadFactory : مصنع الموضوع تستخدم لخلق مواضيع جديدة.

  • معالج : إضافة الفخاخ السياسة عندما مهمة خطأ، الافتراضي هو، يتم إضافة ThreadPoolExecutor.AbortPolicy مهمة الخطأ مباشرة بطرح استثناء.

أربعة أنواع من ترابط التجمع

  • newFixedThreadPool : إنشاء تجمع مؤشرات ترابط ذات حجم ثابت، حتى تتمكن من السيطرة على عدد أقصى من المواضيع المتزامنة، والمواضيع الزائدة الانتظار في الطابور. إذا كان موضوع في تجمع بسبب لغايات غير طبيعية، وسوف تجمع مؤشرات الترابط يكون إضافة موضوع جديد.

    مثال: إنشاء عدد من المواضيع في التجمع موضوع 3

 ExecutorService newFixedThreadPool = Executors.newFixedThreadPool (3)؛ ل(كثافة العمليات ط = 0؛ ط <  10؛ ط ++) { الباحث النهائي finalI = ط؛ newFixedThreadPool.execute (Runnable جديد () { Override المدى باطلة العامة () { محاولة { Thread.sleep (1000)؛ Log.d (TAG، "اسم الموضوع:" + Thread.currentThread () getName () + "ط =" + finalI)؛ } صيد (InterruptedException ه) { e.printStackTrace ()؛ } } } )؛ }

طباعة النتائج:

، ويمكن رؤية 10 المهام التي يؤديها دائما نتيجة الطباعة في ثلاثة موضوع.

  • newSingleThreadExecutor : إنشاء تجمع مؤشر ترابط واحد، تجمع مؤشرات الترابط التي هي دائما موضوع واحد فقط يعمل، وهذا سيضمن أن يتم تنفيذ كافة المهام في الترتيب المحدد. إذا كانت هذه نهاية غير طبيعية موضوع، ثم سيكون هناك موضوع جديد ليحل محله.

    الأمثلة على ذلك:

 ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor ()؛ ل(كثافة العمليات ط = 0؛ ط <  10؛ ط ++) { الباحث النهائي finalI = ط؛ newSingleThreadExecutor.execute (Runnable جديد () { Override المدى باطلة العامة () { محاولة { Thread.sleep (1000)؛ Log.d (TAG، "اسم الموضوع:" + Thread.currentThread () getName () + "ط =" + finalI)؛ } صيد (InterruptedException ه) { e.printStackTrace ()؛ } } })؛ }

طباعة النتائج:

، ويمكن رؤية 10 المهام التي يؤديها دائما نتيجة الطباعة في ثلاثة موضوع.

  • newCachedThreadPool : إنشاء تجمع مؤشرات ترابط مع ذاكرة التخزين المؤقت، في تنفيذ مهام جديدة، عندما تكون هناك مؤشرات الترابط المتوفرة في التجمع موضوع لإعادة موضوع تم إنشاؤها مسبقا قبل، أو لبناء موضوع جديد. إذا كانت المواضيع في تجمع لا تكون قيد الاستعمال في 60 ثانية، سيتم إزالته من تجمع الموضوع.

    الأمثلة على ذلك:

 ExecutorService newCachedThreadPool = Executors.newCachedThreadPool ()؛ ل(كثافة العمليات ط = 0؛ ط <  10؛ ط ++) { الباحث النهائي finalI = ط. newCachedThreadPool.execute (Runnable جديد () { Override المدى باطلة العامة () { Log.d (TAG، "اسم الموضوع:" + Thread.currentThread () getName () + "ط =" + finalI)؛ } })؛ }

من النتيجة المطبوعة، وقد كانت هناك عدة مرات موضوع 1، مشيرا إلى أن هناك موضوع إنشاؤها قبل إعادة استخدامها.

  • newScheduledThreadPool : إنشاء توقيت وتنفيذ تجمع مؤشر ترابط بشكل دوري.

 ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool (3)؛ / ** * تأخير 2 ثانية لأداء المهام * / newScheduledThreadPool.schedule (Runnable جديد () { Override المدى باطلة العامة () { Log.d (. TAG، "اسم الموضوع:" + Thread.currentThread () getName () + "كرون الوظائف")؛ } }، 2، TimeUnit.SECONDS)؛ / * ** 1 ثانية تأخير بعد كل ثانيتين لأداء مهمة * / newScheduledThreadPool.scheduleAtFixedRate (Runnable جديد () { Override المدى باطلة العامة () { Log.d (. TAG، "اسم الموضوع:" + Thread.currentThread () getName () + "مهمة دورية")؛ } }، 1، 2، TimeUnit.SECONDS)؛

يتضح من النتائج المطبوعة، وهي مهمة التوقيت هو لأداء المهمة بعد 2 ثانية، وهي مهمة دورية هي لأداء تأخير المهمة بعد ثانية واحدة كل 2 ثانية.

ورفضت شركة كوكا كولا ل17900000000 الاستحواذ، والربح فقط 100 مليون هذا العام: تراجع العلامات التجارية المشروبات المحلية

مازدا CX-8 معلومات التكوين كشفت! تريد شراء 7 SUV أكثر من هنا!

غاليريا + أضعاف على فتح شراء وضع شراء شراء أضعاف! يونيو Qiazhiyisuan مدروس، وهذا عيد العمال، إلى رقيقة محفظتك!

ليس هناك الثلوج ليلة عيد الميلاد، وتشن كاي T90 "اللعب" على الضال

والجيل الثاني من رجال الأعمال الأغنياء: الفشل التجاري اثنين، والحصول على مساعدة من الآخرين، والآن عشرة مليارات القيمة الصافية

وبالإضافة إلى ذلك هناك مظهر من ماذا؟ اختبار محرك قيمة الين أوباما - بكين هيونداي ENCINO

سيتم وقف كاديلاك CT6 PLUG-IN العام المقبل! المنبع؟

DNF يعلمك أقوى الميتافيزيقيا شحنة تصبح أوروبا ونغ ليس من قبيل الصدفة!

MG معظم الاختبارات صرامة محاكاة ظروف حركة المرور الحقيقية من خلال 6، مع سعر أعلى من 146800 يوان

"أنا نفد" لماذا لا؟ الصين تحتاج الى مزيد من ده وانغ

بعد كل تحليل مهارة من المهارات صغيرة DNF ساحرة النوم يمكن التخلص منها اثنين الأساسية

لامبورغيني أوروس ST-X الرقم الرسمي مفهوم سيارة أطلق سراحه! الأداء الفائق!