لماذا لا تتوقف موضوع لي عندما أحاول الوصول إلى قائمة متزامنة؟

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

  •  22-07-2019
  •  | 
  •  

سؤال

لسبب ما، والناتج من هذا:

 public void msgNeedParts() {
    // Blabla...
    System.out.println(name + ": Try to print 'tasks'...");
    synchronized(tasks) {
        System.out.println(name + ": Tasks--" + tasks);
        System.out.println(name + ": Did I manage to print it?");
        tasks.add(new BinToDump(feeder, binNum));
    }
    stateChanged();
 }

وفقط بطباعة "GantryAgent: حاول الطباعة" المهام "..." ولكن ليس أي من الرسائل التالية. انا التخمين الخيط بطريقة ما "يحصل عالقا" عند محاولة الوصول إلى قائمة متزامنة "المهام"، ولكن لا أعرف لماذا يحدث هذا.

أعلن

'المهام' وتهيئة مثل هذا:

private List<BinToDump> tasks = 
    Collections.synchronizedList(new ArrayList<BinToDump>());

هل يشير أحد ما أنا في عداد المفقودين؟

وآه! وأظن أنني قد يكون المذنب:

    /* If nothing left to do, return to original position. */

    synchronized (tasks) {

        if (tasks.isEmpty()) {

            doReturnToOriginalPos();

        }

    }

في بلدي جدولة (هذا هو تصميم الوكيل)، وتحقق لمعرفة ما إذا كان "المهام" فارغ، ثم أدعو doReturnToOriginalPos (). ربما هذا هو مجرد يحدث مرارا وتكرارا بسرعة أن أساليب أخرى لا تحصل على فرصة لتعديل ذلك؟

وكان ذلك في الواقع المشكلة! أنه أبقى الحصول على ما يسمى بسرعة في بلدي جدولة أن أي شيء آخر يمكن الوصول إلى "المهام". تشكر جميع للمساعدة!

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

المحلول

وشيء لديه تأمين على المهام. اعتمادا على أي نوع من التطبيق هذا، يجب أن تكون قادرا على الحصول على تفريغ كومة كاملة من النظام، ولكن يختلف الأسلوب. على سبيل المثال، وأعتقد أن CTRL-استراحة على معظم appservers المستندة إلى Windows قيام بذلك، وأعتقد إرسال SIGQUIT على لينكس سوف تفعل الشيء نفسه.

وبمجرد الحصول على تفريغ المكدس، يمكنك البحث من خلال ذلك في محاولة لمعرفة أي موضوع آخر لديه تأمين على هذا الكائن.

ويمكنك أيضا استخدام VisualVM للحصول على تفريغ المكدس، لتحقيق الهدف النهائي نفسه:

<اقتباس فقرة>   

ويمكنك استخدام جافا VisualVM لاتخاذ   تفريغ موضوع (تتبع مكدس) في حين أن   والتطبيق المحلي قيد التشغيل. يأخذ   تفريغ موضوع لا يتوقف   تطبيق. عند طباعة موضوع   تفريغ تحصل على نسخة مطبوعة من موضوع   كومة التي تضم الدول موضوع   الخيوط جافا.

     

وعند طباعة تفريغ موضوع في جاوة   VisualVM، وأداة بطباعة كومة   أثر من المواضيع النشطة لل   تطبيق. باستخدام جافا VisualVM ل   تأخذ تفريغ موضوع يمكن أن يكون جدا   مريحة في الحالات التي لا   لدينا وحدة سطر الأوامر ل   تطبيق. يمكنك استخدام تتبع المكدس   للمساعدة في تشخيص عدد من القضايا   مثل المآزق أو عند   توقف التطبيق.

نصائح أخرى

هل من الممكن أن موضوع آخر هو عقد تأمين ضد تزامن tasks؟

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