سؤال

أود أن يكون SynchronousQueue أين يمكنني إدراج عناصر من موضوع واحد مع put(), لذا الإدخال منعت حتى عنصر يؤخذ في موضوع آخر.

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

كيف على الأرض هل هذا ممكن ؟ هنا هو نموذج التعليمة البرمجية:

@Test
public void testQueue() throws InterruptedException {
    final BlockingQueue<Integer> queue = new SynchronousQueue<Integer>();

    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                if (!queue.isEmpty()) {
                    try {
                        queue.take();
                        System.out.println("taken!");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                // do useful computations here (busy wait)
            }
        }
    });
    t.start();

    queue.put(1234);
    // this point is never reached!
    System.out.println("hello");
}

تحرير: لا isEmpty() ولا خاطفة() العمل على المرء أن استخدام استطلاع().وذلك بفضل!

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

المحلول

من http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/SynchronousQueue.html#put(هـ) :

isEmpty
الجمهور منطقية isEmpty()
دائما إرجاع true.أ SynchronousQueue لديه القدرة الداخلية.

(لم ينظر إلى هذا بالتفصيل ، ولكن قد ترغب في إلقاء نظرة على إما استطلاع أو تأخذ بدلا من ذلك)

نصائح أخرى

بالإضافة إلى تيم الجواب - أنت لا تفعل شيئا في المستهلك الموضوع ولكن بشكل مستمر الدعوة isEmpty() في حلقة ضيقة.بدلا من طرح نظام التشغيل لا تعمل حتى هناك شيئا مفيدا أن يفعل ، الاستهلاكية الموضوع بشكل مستمر مشغول.حتى لو isEmpty يعمل بشكل صحيح, المنتج موضوع نادرا ما تحصل على فرصة تشغيل.

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

التعليمات البرمجية الخاصة بك تبدو وكأنها تحاول أن تفعل استطلاع للرأي.لماذا لا نسمي استطلاع() الأسلوب ؟

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