현재 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가 아닌 스레드에서 관찰되어야합니다. 내가 아는 모든 것에 대해 "스레드 가시성"문제가있을 수 있습니다 ...
'PriorityBlockingQueue'의 요소를 소비하는 무한 루프가있는 백그라운드 스레드를 'EventQueue.invokeLater'에 각각 전달하는 것이 더 쉽습니다.물론 각 Runnable의 우선 순위를 결정하기 위해 Comparator가 필요하거나 Runnables 자체를 서로 Comparable로 만들어야합니다. –
VGR
'EventQueue' 이벤트를 우선 순위 화하는 것은 좋지 않은 생각입니다. 모든 GUI 코드가 단일 스레드에서 실행되는 이유가 있습니다. 이벤트 순서를 보존해야합니다. 요구 사항을 구현하는 것은 상대적으로 쉽지만 일단 구현되면 이벤트 주문에 문제가 발생할 수 있습니다. 요구 사항을 다시 생각하는 것이 좋습니다. 긴급한 사건들이 진정으로 너무 오랫동안 연기 되었습니까? 사용자가이 지연을인지합니까? 그렇다면 네, 왜 눈에 띄는 지연이 있는지 살펴볼 것입니다. 대기열에 오래 실행되는 이벤트 (예 : IO 바인딩)가 없는지 확인하십시오. – Muel
이 두 가지 모두 우수한 답변입니다 ... 감사합니다. @Muel - 이벤트 순서의 보존, 네, 맞아 ... 숨겨진 (평행 한) Swing 구성 요소가 전경에서 진행되는 것과 분리되어 있다는 사실은 당신이 언급 한 원칙을 변경하지 않습니다. 세부 사항을 지루하게하지는 않겠지 만, 이제는 상황을 다른 방식으로 보려고합니다! –