문제

나는 내 Java Gui에서 인종 조건을 다루고 있다고 생각합니다.

익명 클래스 내에서 다음과 같은 "익명 방법"을 생성하는 몇 가지 방법이 있습니다.

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

               //stuff

          }
     };
}

질문 : Timertask 객체 또는 Foo가있는 클래스에 동기화 된 실행 메소드입니까?

Question2 : run () 선언에서 "동기화 된"을 제거하고 대신 run () 본체 내부에 동기화 된 (this) {} 블록이있는 경우, "이"는 타이 머스 객체 또는 객체를 참조합니다. foo ()를 포함하는 메소드 인스턴스입니까?

여기서 도와주세요.

감사합니다, JBU

도움이 되었습니까?

해결책

그만큼 run 메소드는 동기화됩니다 TimerTask 그 자체. 동기화 인스턴스 방법입니다 언제나 동기화 this 물체. (클래스 메소드는 동기화됩니다 Class 물체.)

그 객체에 동기화하려면 foo 회원입니다 자격을 갖추십시오 this 예어. 가정하다 foo() The의 회원입니다 Bar 수업, 내부 run() 의 방법 TimerTask, 당신이 사용할 수있는

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

다른 팁

나는이 답변을 확신하지만 좋은 소스 ATM을 파낼 수는 없습니다.

첫 번째 질문 :
동기화 된 것은 타이머 스탁에서 잠금됩니다.

두 번째 질문 :
이것은 타이머 스탁을 의미합니다. 포함 된 개체를 잠그고 싶다면 MyContainingObject를 사용합니다.

스윙 요소에 액세스 할 수있는 스레드는 하나뿐입니다. 그것은 awt-eventqueue-0입니다. 당신은 이것을 알고 있어야합니다. 다른 스레드가 드러나거나 변경되는 경우 GUI가 충돌 할 확률이 매우 양호합니다. 이 스레드로 GUI를 실행하려면 다음과 같습니다.

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

그리고 Anonymus 클래스가 있다면 이것은 당신에게 당신의 클래스 인스턴스를 제공 할 것입니다. 따라서 Anonymus 클래스에서 글을 쓰고 있다면 이것. 해당 클래스의 인스턴스입니다. 클래스 인스턴스를 얻으려면 쓰기를 원하는 것입니다.

classname.this

흠 당신이 쓴 위의 코드는 이것을 말해줍니다. 당신은 코드의 일부를 두 번 먹었습니다. SynCronized 메소드를 작성하면 한 번만이 메소드에 한 번에 액세스 할 수 있음을 의미합니다. SynCronized 메소드가 잠금 해제되는 동안 다른 스레드가 기다립니다.

foo () 및 run ()을 동기화하려는 경우

최종 객체 잠금 = 새 개체 ();

그런 다음 동기화하십시오.

foo() {
    synchronized(lock) {
       someMethod(new TimerTask() {
          public void run() {
              synchronized(lock)  {
                     //stuff
              }
          }
      }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top