1
دعنا نتحدث عن Semaphore أولاً. يمكن لـ Semaphore التحكم في عدد الموارد التي يمكن الوصول إليها في وقت واحد ، والحصول على ترخيص من خلال الحصول على () ، وانتظر إذا كان هناك لا ، وإصدار () إصدار ترخيص. يتم استخدامه بشكل عام للتحكم في عدد الخيوط المتزامنة والاستبعاد المتبادل بين المواضيع. بالإضافة إلى ذلك ، يمكن لـ reentrantlock أيضًا تنفيذ هذه الوظيفة ، لكن التنفيذ أكثر تعقيدًا.
الوظيفة تشبه جميع الحفر الخمسة في المرحاض. إذا كان على 10 أشخاص أن يذهبوا إلى المرحاض ، فكم عدد الأشخاص الذين لا يمكنهم الذهاب إلى المرحاض إلا في نفس الوقت؟ في الوقت نفسه ، يمكن ل 5 أشخاص فقط شغلها. عندما يتحرك أي من الأشخاص الخمسة جانباً ، يمكن لأحد الأشخاص الخمسة الآخرين الذين ينتظرون أن يشغلوه. بالإضافة إلى ذلك ، من بين الأشخاص الخمسة الذين ينتظرون ، يمكنهم الحصول على فرص ذات أولوية عشوائية ، أو يمكنهم الحصول على فرص من أجل القدوم أولاً ثم الوصول.
يمكن لكائن Semaphore واحد تطبيق وظيفة mutex ، ويمكن الحصول عليه بواسطة مؤشر ترابط واحد وإطلاقه بواسطة مؤشر ترابط آخر. يمكن تطبيق ذلك في بعض حالات الانتعاش.
مثال:
/** * @Description: * param @param args * return return type */public static void main (string [] args) {// pool pool executorservice exec = executors.newcachedthreadpool () ؛ // فقط 5 مؤشرات ترابط يمكنها الوصول إلى SEMP Final SEMP = Semaphore جديد (5) ؛ . RunNable Run = new RunNable () {public void run () {try {// Get Semp.acquire () ؛ System.out.println ("Get Accessing:" + NO) ؛ thread.sleep ((long) (Math.Random () * 10000)) ؛ // بعد الوصول ، reegr semp.release () ؛ System.out.println ("SaybleaVailivation signals----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------نتيجة الإخراج (فكر في سبب إخراج مثل هذا):
الحصول على الوصول: 1 الحصول على الوصول: 5 الحصول على الوصول: 2 الحصول على الوصول: 3 الحصول على الوصول: 0 المتبقية متوفرة إشارة -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 13 إشارات قابلة للبقاء ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2. استخدم الأنابيب كجسر بين الخيوط
أنبوب لديه قناة مصدر وقناة بالوعة. سيتم كتابة البيانات إلى قناة الحوض وقراءة من قناة المصدر. واحد في وواحد. دعنا نتعلم أولاً كيفية استخدامه.
تجدر الإشارة إلى أنه بموجب java.nio.channels ، تشير هذه الفئة إلى أن طريقة اتصال البيانات لطريقة NIO تستخدم ، لذلك استخدم المخزن المؤقت لبيانات المخزن المؤقت.
توضيح مبدأ الأنابيب:
الأنابيب هو أنبوب فارغ. يمكن قراءة أحد طرفي هذا الأنبوب الفارغ من داخل الأنبوب ويمكن كتابة الطرف الآخر في الأنبوب.
عملية التشغيل:
1. أولاً ، يجب أن يكون هناك كائن لكتابته في هذا الأنبوب الفارغ. أين تكتب؟ يحتوي هذا الأنبوب الفارغ على مساحة صغيرة ، مباشرة في هذا الأنبوب.
عند الكتابة ، تتم كتابتها في الفضاء الواردة في الأنبوب نفسه. هذا حجم المساحة هو 1024 بايت.
2. ثم يمكن لخطاة آخر قراءة محتويات هذا الأنبوب المملوء.
على الكود
package com.jx.test ؛ استيراد java.io.ioException ؛ استيراد java.nio.bytebuffer ؛ استيراد java.nio.channels.pip أنبوب أنابيب خط خط الأنابيب = pipe.open () ؛ pipe. {system.out.println ("send ......") ؛ // قم بإنشاء مؤشر ترابط واستخدم PIPE PROTE PIPE.SinkChannel type لكتابة محتوى البتابات المحددة في خط الأنابيب int res = psic.write (bytebuffer .wrap ("hello ، pipe! اختبار الاتصال ... res) ؛} catch (استثناء e) {E.PrintStackTrace () ؛}}} ؛ مؤشر ترابط tpreader = new thread () {public void run () {int bbuffersize = 1024 * 2 من أنبوب خطوط الأنابيب. نوع psoc type psoc لقراءة المحتويات في خط الأنابيب في bytebuffer المحدد int res = psoc.read (bbuffer) ؛ {E.PrintStackTrace () ؛}}} ؛ tpwriter.start () ؛ tpreader.start () ؛}/***byteBuffer-> وظيفة تحويل السلسلة*/السلسلة الثابتة العامة bytebuffertostring (محتوى bytebuffer) {if (محتوى == null || content.limit () content.remaining ())) {system.out.println ("غير موجود أو المحتوى فارغ!") النتائجلخص
ما ورد أعلاه يدور حول أمثلة برمجة Java Programming Comminive و Smaphore في هذه المقالة ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!