سؤال

أنا أتعامل مع حالة السباق ، على ما أعتقد ، في واجهة المستخدم الرسومية Java.

لدي بعض الطرق التي تنشئ "طريقة مجهولة" داخل فئة مجهولة مثل هذا:

synchronized foo()
{
     someMethod(new TimerTask()
     {
          public synchronized run()
          {

               //stuff

          }
     };
}

سؤال: هل طريقة التشغيل هذه تتم مزامنة على كائن timertask أو الفئة التي يوجد فيها فو؟

Question2: إذا تخلصت من "المزامنة" في إعلان Run () ، وبدلاً من ذلك ، فإن كتلة متزامنة (هذا) {} هل مثيل للطريقة التي تحتوي على foo ()؟

الرجاء مساعدتي هنا.

شكرا ، JBU

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

المحلول

ال run تتم مزامنة الطريقة على TimerTask بحد ذاتها. متزامن طرق مثيل هي دائماً متزامن على this هدف. (تتم مزامنة طرق الفصل على Class هدف.)

إذا كنت تريد المزامنة على الكائن الذي foo هو عضو ، تحتاج إلى ذلك تأهل this الكلمة الرئيسية. افترض foo() هو عضو في Bar الفصل ، داخل run() طريقة TimerTask, ، يمكنك استخدام

public void run() {
  synchronized(Bar.this) {
    ...
  }
}

نصائح أخرى

أنا متأكد تمامًا من هذه الإجابات ، لكن لا يمكنني حفر أجهزة الصراف الآلي المصدر الجيدة.

السؤال الأول:
سوف تزامن قفل على timertask.

السؤال الثاني:
هذا يشير إلى timertask ؛ إذا كنت ترغب في قفل الكائن الذي يحتوي على myContainingObject

لا يوجد سوى موضوع واحد يمكن أن يحصل على عناصر التأرجح. هذا awt-eventqueue-0. عليك أن تكون على دراية بهذا. إذا كانت هناك عناصر أخرى من خيوطك أو تغيير عناصر ، فهناك احتمال جيد للغاية على تعطل واجهة المستخدم الرسومية. لتشغيل واجهة المستخدم الرسومية مع هذا الموضوع:

  try {
            SwingUtilities.invokeAndWait(new Runnable(){
                public void run(){
                    Swing_Prozor1 prozor = new Swing_Prozor1();
                }
            });
        } catch (InterruptedException e) {
            //namjerno zanemareno
        } catch (InvocationTargetException e) {
            //namjerno zanemareno
        }

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

ClassName.This

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

إذا كنت تبحث عن مزامنة Foo () وتشغيلها () ، فيمكنك إنشاء كائن قفل صريح مثل

قفل الكائن النهائي = كائن جديد () ؛

ثم تزامنه.

foo() {
    synchronized(lock) {
       someMethod(new TimerTask() {
          public void run() {
              synchronized(lock)  {
                     //stuff
              }
          }
      }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top