سؤال

أنا أكتب خادم مأخذ توصيل متعدد الخيوط.أنا استخدم نيو ServerSocketChannel لقبول الاتصالات.ثم أنا أقرأ وأكتب (في مواضيع منفصلة) ل socketChannel استخدام bufferedreader وكاتب الطباعة.المشكلة هي PrintWriter يقفل وينتظر flush() يأمر.إنه يمنع الخيط حتى BufferedReader استقبال البيانات.

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

المحلول

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

نصائح أخرى

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


كيف يمكنك حل هذا؟أولا بعض الأشياء العامة.

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

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


فيما يلي بعض الأشياء التي قد تساعدك في حالتك الخاصة.

  • قلل من كمية الأشياء التي تكتبها في سلاسل المنتِج.

  • قم بعمل أقل في سلاسل المحادثات الخاصة بالمستهلكين، أو قم بملفهم الشخصي/ضبطهم للقيام بالعمل بشكل أسرع.

  • لا تستخدم مأخذ توصيل للتواصل بين خيطين في نفس JVM.إذا كان بإمكانك ترتيب ذلك، فاستخدم زوج Java PipeInputStream / PipeOutputStream، أو قم بتدوير المعادل الخاص بك.(إذا كنت تستخدم مأخذ توصيل، فإن القراءة والكتابة تتضمن استدعاءات النظام، ونسخ البيانات داخل وخارج المخازن المؤقتة للنواة وما إلى ذلك.)

  • في حالة الاتصالات لابد ان اذهب خارج JVM، وتأكد من أنك تستخدم Buffered* أغلفة التدفقات الأساسية لتقليل عدد مكالمات النظام التي يتم إجراؤها أثناء القراءة / الكتابة.

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