سؤال

لدي خيطان. يقوم الموضوع A بسحب بعض العناصر من قائمة الانتظار ويقوم الخيط B بإضافة بعض العناصر إلى قائمة الانتظار.

أريد أن يذهب الخيط A للنوم عندما يكون قائمة الانتظار فارغة.

عندما يضيف الموضوع B بعض العناصر إلى قائمة الانتظار ، يجب أن يتأكد من أن الخيط A يعمل. كيف يمكن القيام بذلك في جافا؟

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

المحلول

إستخدم BlockingQueue, ، الذي:

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

على محمل الجد ، لا تحاول إعادة اختراع العجلة هنا.




(اذا أنت يجب استخدم الانتظار/الإخطار ، اقرأ هذا البرنامج التعليمي. لكن تجنب نفسك الألم ، من فضلك!)

نصائح أخرى

فيما يلي بعض التفاصيل:

import java.concurrent.Executors;
import java.concurrent.ExecutorService;
...
ExecutorService executor = Executors.newFixedThreadPool(someNumberOfThreads);
...
executor.execute(someObjectThatImplementsRunnable);
...
executor.shutdownNow();

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

إنه أبسط بكثير الآن مما كان عليه.

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

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