3

확실한 방법입니다.하지만 확실하게 알고 싶습니다. - 은 invokeLater() 또는 invokeAndWait()의 경우 주어진 관계 이전에 발생합니까?invokeLater() 또는 invokeAndWait의 경우 관계가 제공되기 전에 발생합니까?

메소드는 (SwingUtilities 각각) AWT.EventQueue에 정의되어 있습니다. 뭔가가 EventQueue 에 입력되었을 때 동기화가 발생했기 때문에 동기화 결과로 발생하기 전에 관계가 나타나고 마지막으로 가시성이 주어집니다.

하지만 실제로 그렇게 할 수 있습니까? (내가 그 정보를 어디에서 찾을 수 있습니까?)


예를 들어, 일부 작업자 스레드 내부

... 
    *<1> heavy computation modifying lots of DATA* 
    ... 
    SwingUtilities.invokeLater(
     new Runnable() { 
      @Override 
      public void run() { 
       *<2> is visibility of modified DATA guaranteed?* 
      } 
     } 
    ); 

예를 들어, 일부 스레드 한마디로

... 
    SwingUtilities.invokeAndWait(
     new Runnable() { 
      @Override 
      public void run() { 
       ... 
       *<1> change some DATA* 
      } 
     } 
    ); 
    *<2> is visibility of modified DATA guaranteed?* 
+0

나는 정말로 당신이 묻고 자하는 것을 이해하지 못합니다. – jzd

+0

위치가 <1> 인 일부 스레드의 첫 번째 예제에서 데이터가 변경된 후 invokeLater()가 호출됩니다. 변경된 데이터가 실행 가능 영역 안의 <2> 위치에 표시됩니까? – user3199797

+1

invokeAndWait는 EDT에서 호출해야합니다. isEventDispatchThread가 false를 반환해야합니다. 그렇지 않으면 몇 가지 예외가 스윙 GUI를 동결시킬 수 있습니다. – mKorbel

답변

1

내부 은 : 네, 이 발생-이전 관계하여 제출 한 실행 가능한의 EDT에 invokeLater/invokeAndWait과 행동을 호출 스레드의 행동 사이에 부과있다. 그것 없이는 전체 API의 온 전성이 위태로워 질 것입니다.

공신력이있는 출처를 확인하는 것이 어렵습니다. 스윙과 동시성에 관한 많은 것들이 발생합니다.

자세한 내용은 this answertrashgod으로 오랜 시간 스윙 전문가를 참조하십시오.

+1

+1을 보수적으로 읽으십시오. – trashgod

+0

@MarkoTopolnik : 감사합니다! 나는 그것을 받아 들여야 만한다. AWT EventQueue는 작업/Runnable이 invokeLater()에 의해 EventQueue에 푸시 될 때 FIFO 순서를 보장하기 때문에 동기화가 있어야합니다. 결과적으로 "invokeLater()"호출은 "작업 시작"및 가시성이 (이 방향으로) 제공되기 전에 발생한다고 가정 할 수 있습니다. 이 작업은 적어도 invokeLater()가 호출 된 시점의 값을 확인합니다. 어쨌든 내부 구현에 대해서는 고려하지 않아도되지만 신뢰할 수있는 출처 (예 : API)를 사용하는 것이 좋습니다. – user3199797

관련 문제