سؤال

عند استخدام الخيوط، أتخيلها أحيانًا على أنها تنسج معًا 3 أو أكثر من الترابطات الأبعاد بين الكائنات في سياق مكاني.هذا ليس سيناريو حالة استخدام عام، ولكن ما أفعله هو طريقة مفيدة للتفكير في الأمر.

هل هناك أي واجهات برمجة التطبيقات التي تستخدمها والتي تساعد على الترابط؟

هل استخدمت المواضيع بطريقة لا تتصور أن الخيط هو عملية؟

هل كانت مفيدة؟

المحلول

هل هناك أي واجهات برمجة التطبيقات التي تستخدمها والتي تساعد على الترابط؟

تقصد بصرف النظر عن java.util.concurrent? وظيفيةJava حصلت على بعض التركيبات التي تساعد في البرمجة المتزامنة، كما هو موضح في البرنامج التعليمي متعدد الأجزاء الذي يبدأ هنا.

هل استخدمت المواضيع بطريقة لا تتصور أن الخيط هو عملية؟

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

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

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

نصائح أخرى

أولاً

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

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

واجهات برمجة التطبيقات المتزامنة لجافا

لقد قطعت Java شوطًا طويلًا في جعل البرمجة المتزامنة سهلة قدر الإمكان للمطورين.في معظم الحالات، سترى ذلك java.util.concurrent يحتوي على معظم التجريدات التي ستحتاج إليها:

  • Runnable واجهة و Thread كائن يمكنك تمديده.ما عليك سوى إدخال الكود الخاص بك وسيكون لديك موضوع جاهز للتشغيل
  • مجموعة لطيفة من Executors:تجمع ثابت، تجمع ديناميكي، مجدول، أو أي شيء آخر.مجرد رمي أ Runnable فيه ويفعل الباقي.
  • Semaphoreس و أقفال من جميع الأنواع يريحك من الحاجة إلى تنفيذ تقنيات القفل الشائعة.
  • مدمج wait() و notify() API لجميع الكائنات.

الاستخدامات

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

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

النقطة الرئيسية (أو متى تستخدم)

استخدم سلاسل الرسائل فقط عندما يؤدي التزامن إلى تحسين سلوك تطبيقاتك بشكل مباشر.

إذا كنت تنتظر موردًا مرتبطًا بالإدخال/الشبكة/الأجهزة، يفعل قم بإنشاء خيط عليه حتى تتمكن من الاستمرار في القيام بأشياء أخرى.

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

إذا كنت تستخدم الخيوط، فتأكد من أنك فكرت جيدًا في المخاطر، وتحققت ثلاث مرات من أنك لم تفوت أي مواقف استثنائية.

موارد مفيدة (عبر الإنترنت).

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

حظ سعيد :)

والتزامن هو موضوع عميق ومعقد لتغطية. كتب مثل جافا التزامن في الممارسة قد تساعد.

التزامن المرافق نظرة عامة للحصول على واجهات برمجة التطبيقات على خيوط. BlockingQueue يمكن أن تكون مفيدة على سبيل المثال.

<اقتباس فقرة>   

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

CountDownLatch

<اقتباس فقرة>   

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

CyclicBarrier لبعض السلوك مثيرة للاهتمام.

<اقتباس فقرة>   

وهناك مساعدات المزامنة التي تسمح لل   مجموعة من المواضيع لجميع انتظر كل   البعض للوصول إلى نقطة حاجز المشتركة.

تعديل : في أنا أقرأ جافا التزامن في الممارسة الآن. انها جيدة جدا.

<اقتباس فقرة>   

عند استخدام المواضيع أنا أحيانا تصور لهم كما نسج معا 3 أو أكثر من الأبعاد الترابط بين الكائنات في سياق المكاني.

وهذا لا يبدو معقدا، كيف تصورا 600 المواضيع على سبيل المثال؟ لماذا لا يفكر فيها المواضيع كما متعددة من تشغيل التنفيذ على ما يبدو في وقت واحد.

<اقتباس فقرة>   

هل هناك أي واجهات برمجة التطبيقات التي تستخدمها والتي خيوط المساعدات؟

وأقترح أبسط وأكثر مباشرة لمواصلة المسيرة أول مباراة فستجد. http://www.google.co.uk/search؟q=java+ المواضيع

<اقتباس فقرة>   

هل استخدمت المواضيع بطريقة لا تصورا كما موضوع كونه العملية؟

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

وهناك وجهة نظر أن متعدد خيوط معقدة. في الواقع أود أن أقول العكس. تتطلب متعددة الخيوط البرمجة لك لجعل الرمز الخاص بك بسيطة وسهلة قدما فهم ومباشرة لسبب عنه. في حين أن هذا يأخذ الخبرة، هدفكم هو البساطة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top