2012-12-10 5 views
2

현재 EventQueue에 대기중인 Runnable의 수를 결정할 수있는 방법이 있습니까? ... 즉 시스템의 EventQueue, 즉 모든 Runnables가 EDT에서 실행될 수 있습니다. 대기열을 어지럽 혔어, 아마도?EventQueue에서 대기중인 Runnables의 수를 찾으십시오.

내가 원하는 것은 GUI Runnables에 우선 순위를 부여하는 것입니다. 사용자 중심의 GUI 이벤트가 발생하면 바로 실행해야합니다. 대기중인 Runnables보다 먼저 큐를 점프해야합니다. 보이지 않는 Swing 구성 요소를 수정하는 것에 관심을 가져야합니다 .NB 최신 Swing 지침 : 숨겨진 경우라도 모든 Swing 구성 요소는 EDT에서 변경해야합니다.

"긴급"및 "긴급하지 않은"Runnables가있는 단순한 고안된 큐에 대한 가능성이 있습니다. 각 Runnable은 "관찰 가능한"AtomicInteger 카운터를 증가시킬 수 있으며 각 실행은이를 감소시킬 수 있습니다. BlockingQueue는, BlockingQueue의 사이즈가 1 (또는 아마 2 또는 0)로 변경되었을 경우, 비 긴급 Runnables가 "invokeLater"에게만 송신되는 것을 보증합니다. 본능은 그러한 배열이 꽤 잠복기를 가져올 것이라고 생각하게 만듭니다.

플러스 EDT 자신의 대기열에 직접 간섭하는 것이 더 좋을 것입니다. 내 EDT 대기열을 굴려야하나요? 그게 가능하니?

NB 분명히 EDT 큐의 상태 (또는 간섭)는 EDT가 아닌 스레드에서 관찰되어야합니다. 내가 아는 모든 것에 대해 "스레드 가시성"문제가있을 수 있습니다 ...

+0

'PriorityBlockingQueue '의 요소를 소비하는 무한 루프가있는 백그라운드 스레드를 'EventQueue.invokeLater'에 각각 전달하는 것이 더 쉽습니다.물론 각 Runnable의 우선 순위를 결정하기 위해 Comparator가 필요하거나 Runnables 자체를 서로 Comparable로 만들어야합니다. – VGR

+2

'EventQueue' 이벤트를 우선 순위 화하는 것은 좋지 않은 생각입니다. 모든 GUI 코드가 단일 스레드에서 실행되는 이유가 있습니다. 이벤트 순서를 보존해야합니다. 요구 사항을 구현하는 것은 상대적으로 쉽지만 일단 구현되면 이벤트 주문에 문제가 발생할 수 있습니다. 요구 사항을 다시 생각하는 것이 좋습니다. 긴급한 사건들이 진정으로 너무 오랫동안 연기 되었습니까? 사용자가이 지연을인지합니까? 그렇다면 네, 왜 눈에 띄는 지연이 있는지 살펴볼 것입니다. 대기열에 오래 실행되는 이벤트 (예 : IO 바인딩)가 없는지 확인하십시오. – Muel

+0

이 두 가지 모두 우수한 답변입니다 ... 감사합니다. @Muel - 이벤트 순서의 보존, 네, 맞아 ... 숨겨진 (평행 한) Swing 구성 요소가 전경에서 진행되는 것과 분리되어 있다는 사실은 당신이 언급 한 원칙을 변경하지 않습니다. 세부 사항을 지루하게하지는 않겠지 만, 이제는 상황을 다른 방식으로 보려고합니다! –

답변

1

나는 생각하지 않습니다. 코드를 사용할 수 있습니다. 그것을 오버라이드 (override) 해, 재 작성 할 수 있습니다 만, 실제의 EventQueue는 시스템에 의해 설정됩니다. 당신은 몇 가지 정의 된 방법을 제외하고는 그것에 도달 할 수 없습니다. 자신 만의 설정을하고 사용할 수는 있지만 모든 스윙 구성 요소는 공식 EQ를 사용할 것이므로 멀티 스레딩 스윙을하게 될 것입니다. (개인적인 경험에서이 이상한 행동을 가끔, 악화, 설명 할 수없는 비트를 제외하고, 아주 잘 작동 내 조언 :.. 당신이 EventQueue로 아니라면 결코 심지어 는 스윙 구성 요소에 대한 생각을)

을 (당신이 만약 1.4 EventQueue 클래스는 아름다운 코드 조각이었습니다 .7.7은 이전의 wait/notify 대신 thread safe, non-blocking 건너 뛰기 목록을 사용하는 것 같습니다. 빠르지 만 코드는 괴물이라고 확신합니다. 어떤 이유에서든 자신 만의 큐를 만들고 싶다면 시작점을위한 1.4 코드를 얻으십시오. 자바는 일반적인 실행 큐 클래스를 가져야하지만, 아직 찾을 수는 없습니다.)

정말로 EventQueue 퍼포먼스에 많은 문제가있어서는 안됩니다. 초당 CPU 초보다 훨씬 적게 사용해야합니다. CPU 집약적 인 실행 파일을 많이 삭제하지 않는 한, 걱정할 필요가 없습니다. 그렇다면 다른 스레드에 작업을 넣는 것이 좋습니다. UI를 느리게하는 것은 모든 스레드를 단일 스레드로 유지하는 데 드는 비용이 적게 드는 것처럼 보입니다. 대기열을 재정렬하면 어쨌든 많은 도움이되지 않습니다. 신속하게 처리하려는 실행 파일은 큰 계산을 시작한 직후 도착하게됩니다.

순서대로 고유 한 실행 파일을 실행하려는 경우 분류 된 실행 파일 목록을 유지하는 클래스를 설정할 수 있습니다. InvokeLater를 사용하여 EQ에 드롭 할 수있는 자체 실행 파일을 갖게됩니다. 그것이 실행될 때, 차례대로 원하는 순서로 실행 파일을 실행할 수 있습니다. 그러나 이것은 자신의 목적에 맞게 분류 된 주행 장치가 필요한 경우에만 도움이됩니다.

스윙 구성 요소로만 작업하거나 보이는 경우에는 InvokeLater로 설계된대로 EQ를 사용하여 모든 작업을 처리 할 수 ​​있습니다.

+0

문제를 명확히 해 주셔서 감사합니다. 나는 어떤 EDT/스윙 이단에서든지 탐닉하지 않을 것이다. 동시성에 대해서는 확신 할 수 없다. 단, 이단이 몇 개월 후에 다시 생겨 최악의 기회로 부랑아에게 물어 뜯을 것이다! –