كيف يمكنني محاكاة I/O غير الحظر في Java باستخدام المواضيع

StackOverflow https://stackoverflow.com/questions/3897755

  •  29-09-2019
  •  | 
  •  

سؤال

أنا أكتب تطبيقًا بسيطًا يتضمن خادمًا والعديد من العملاء في الوقت المناسب. لا بد لي من استخدام datagramsocket. التطبيق هو تبادل بسيط للرسائل من خلال وحدة التحكم كما في الدردشة. لكن كلتا العمليتين in.ReadLine () و Ds.Receive () يحظران ووضعهما في خيوط منفصلة لم يساعد لأن حظر I/O سيمنع الخيط أيضًا. هل يمكن لأي شخص أن يخبرني كيف يمكنني فعل ذلك بدون NIO

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

المحلول

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

ثم ، دعنا ننظر في تأثير هذا الحل على عدد مؤشرات الترابط في تطبيقك:

  • إذا كان لديك عدد قليل فقط من العملاء لكل خادم ، فإن وجود مؤشرات ترابط I/O لكل عميل ليس مشكلة.
  • إذا كان لديك الكثير من العملاء لكل خادم ، فيجب عليك قبول حقيقة أن بعض طلباتهم ستتم معالجتها على الفور ولكن عندها فقط يتوفر مؤشر ترابط العمال. يمكنك محاولة تفرخ أكبر عدد من مؤشرات الترابط I/O كما يوجد عملاء ، ولكن هناك قيود على عدد مؤشرات الترابط التي يمكن أن تحتوي عليها مثيل JVM الفردي. تعتمد الأرقام الدقيقة على حجم الكومة المتاحة لـ JVM وما إذا كانت بنيةك هي 32 بت أو 64 بت ، انظر هنا.

إذا كنت مهتمًا بمهمة عامة للتعامل مع الكثير من العملاء ، هنا هي ورقة الويب الكلاسيكية في هذا السؤال.

نصائح أخرى

أولاً ، يجب عليك استخدام java.nio للحصول على I/O غير المحظورة. على افتراض أنك لا تستطيع ، لسبب ما ...

يمكنك بسهولة الحصول على بيانات معالجة الخادم الخاصة بك من عملاء متعددين باستخدام DataGramSocket و queue ، مثل java.util.concurrent.threadpoolexecutor.

والفكرة هي أن لديك مؤشر ترابط استقبال واحد يقرأ المقبس ، ويتم استلام كل قاعدة بيانات ، ملفوفة في كائن "تم استلامها" وإسقاطه على ميدان العمل. يحتوي queue على تجمع الخيوط الذي يزيل الخيوط ويعالج كل حزمة ؛ إذا كانت الحزمة تتطلب استجابة ، فإن مؤشر الترابط يرسل الاستجابة (الحظر) قبل الحظر لإزالة Dequeue TrabtDatagram.

لإرسال البيانات بشكل غير متزامن ، يمكنك ببساطة وضع كائن "SendDatagram" على queue العمل الذي يمثل datagrampacket لإرساله.

ملاحظة ، سوف تستخدم datagram.receive (datagrampacket) و datagram.send (datagrampacket).

يمكنك القيام بذلك عن طريق القيام بعمليات الحظر في مؤشرات ترابط منفصلة ، باستخدام إما مؤشر ترابط أو مجموعة أفضل يدويًا (http://www.ibm.com/developerworks/library/j-jtp0730.html)

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