2011-08-25 3 views
4

내가 EventQueue에 대한 일관성없는 행동을 보여줍니다 다음 예제 코드에 문제가 있습니다 기본적으로EventQueue의 일관성 ID의

public static void main(String[] args) throws InvocationTargetException, InterruptedException { 

    final long[] id1 = new long[ 1 ]; 
    final long[] id2 = new long[ 1 ]; 

    EventQueue.invokeAndWait(new Runnable() { 
     @Override public void run() { 
     id1[ 0 ] = Thread.currentThread().getId(); 
     } 
    }); 

    Thread.sleep(5000); 

    EventQueue.invokeAndWait(new Runnable() { 
     @Override public void run() { 
     id2[ 0 ] = Thread.currentThread().getId(); 
     } 
    }); 

    System.out.println("id1 = " + id1[0]); 
    System.out.println("id2 = " + id2[0]); 

    if(id1[0]!=id2[0]){ 
     System.out.println("These ID's don't match, even though they were retrieved from the same thread."); 
    } 

    } 

를, 그것은 EventQueue로 스레드의 ID를 가져옵니다 5 초 대기 후 다시 ID를 가져옵니다 .

어떤 이유로 ID가 일치하지 않습니다. 분명히, EventQueue는 파괴되고 재창조되었습니다. 이것은 정상적인 행동입니까? 이것이 어딘가에 기록되어 있습니까? 그게 버그 야? 다른 인스턴스 인 경우에도 ID가 같지 않아야합니까?

Thread.sleep을 수행하지 않으면 ID가 일치합니다.

내 다른 질문은 :이 문제를 어떻게 해결할 수 있습니까? 내가 만드는 스레드에서 액세스 할 수있는 개체를 사용하고 있습니다. 이것이 이벤트 큐 (반드시 필요하지는 않음) 인 경우, 여전히 이벤트 큐인지 확인할 수 있어야합니다. 더 이상 필요하지 때 AWT 이벤트 발송 쓰레드 가 종료되지 하소서

답변

2

(this page는 spectification와 JDK 7의 실제 구현의 동작을 모두 설명).

여기에 나타나는 것 같습니다. EventQueue 시스템을 사용하여 하나의 이벤트를 처리합니다. 그러면 더 이상 필요하지 않습니다 (AWT/Swing 구성 요소 없음 ...). 잠시 후 종료됩니다.

그런 다음 EventQueue을 다시 사용하면 다른 스레드가 해당 역할을 대신하도록 시작됩니다.

는 그래서 여기 발생하면 Runnable.run() 방법 두 가지 스레드에서 실행 얻을 할 것입니다. 스레드는 모두 JVM 라이프 사이클의 다른 시간에 "AWT Event Dispatch Thread"입니다.

어쩌면 EventQueue.isDispatchThread()을 사용하여 특수 케이스가 가능한 해결책이 될 수 있습니다.

+0

감사합니다. 나는 거기에 EventQueue 스레드 자체에 대한 특별한 검사보다 더 좋은 방법이있을 것이라고 기대했지만, 내가해야만 할 것 같아요. :) – Tovi7

+0

두 개의 서로 다른 이벤트 스레드를 동일한 것처럼 처리하기 때문에 요구 사항이 특별한 경우라고 말하고 싶습니다. ** 정말로 ** 같은 스레드 액세스 만 허용하려는 경우 해당 체크를 남겨두고 스레드 ID를 테스트하면 충분합니다. –