(아래 편집을 읽으십시오.이 질문은 분명히 혼란 스럽습니다.)자바 : 거기 SwingUtilities.invokeNowOrLaterIfEDT (...) 또는 이와 유사합니까?
다음은 일반적인 SwingUtilities.invokeLater
호출입니다.
SwingUtilities.invokeLater(new Runnable() {
public void run() {
...
}
});
이제는 SwingUtilities.invokeNowOrLaterIfEDT
.
그러나 이것은 EDT에서 호출 될 때마다 새로운 스레드를 만드는 단점이 있습니다. (그리고 새로운 스레드를 기다릴 필요가 없습니다. 예정대로).
Runnables
을 대기열에 넣기 위해 일부 차단 대기열을 사용하여 응용 프로그램 수명주기 동안 실행중인 추가 스레드 (지연 생성이 가능)를 실행하는 또 다른 방법이 있습니다. 이점은 EDT와 같은 메서드를 호출 할 때마다 스레드가 끊임없이 생성되지 않는다는 것입니다.
기본 Java API에는 이와 비슷한 것이 있습니까?
위의 예와 같이 EDT에서 호출 할 때마다 새로운 스레드를 작성하거나 EDT 외부에서 실행될 Runnables
가 대기열에 추가되거나 다른 스레드가있을 때마다 새 스레드를 작성하면됩니까?
EDIT : SwingUtilities.invokeLater
가 EDT에서 호출되었거나 호출되지 않았을 수 있음을 염두에두고 있던 방법이 EDT에서 호출되었거나 호출되지 않았을 수 있습니다. GUI/EDT에서 사용자 조치로 인해 트리거 될 수도 있고 트리거되지 않을 수도있는 완전히 비동기적인 것을 실행하는 것입니다. 제 생각에 SwingUtilities.invokeLater
은 EDT에 있거나 EDT에있을 때 호출 할 때 신경 쓰지 않고 EDT에서 무언가를 실행할 수 있다는 점에서 매우 편리하다고 생각합니다. 그리고 제가 위에 보여준 invokeNowOrLaterIfEDT(...)
은 매우 편리하다고 생각합니다. 그러나 나는 그것에 착각 할 수도 있습니다. 그런 방법에 대한 필요성이 미쳤습니까? 이제 나는 의심하기 시작했다!?
EDIT TWO : 전혀 명확하지 않았고 깨닫습니다. 죄송합니다. EDT가 아닌 비동기로 실행하려는 작업은 매우 긴 프로세스가 아니며 진행률 표시 줄이나 진행 상황을 보여주는 것과 같은 업데이트가 필요하지 않습니다. 그것은 또한 단일 스레드/대기열 (분명히, 내가 질문에 명시된 경우) 문제가 아니에요. 나는 스레드 풀 (thread pool) 이후에 효율적으로 다양한 코어에 부하를 분산시키는 것이 아닙니다. 이것은 단지 EDT에서 실행될 필요가없고 EDT에서 호출 될 수있는 작은 계산이기 때문입니다. EDT 외부에서 실행하고 싶은 작은 비동기식 기능입니다.
하지만 지금은 답을 통해 단일 스레드와 Runnable 큐를 사용하여 구현 된 것이라면 긴 계산을위한 그런 유틸리티 메소드를 호출함으로써 발에서 총을 쏘아내는 것은 매우 쉽다.
이게 당신이 원하는 것입니다. invokeNowOrLaterIfEDT에 전달 된 실행 파일이 EDT –
에서 실행되지 않으므로 달성하고자하는 목적이 무엇인지, 어쩌면 우리는 대안을 제공 할 수 있습니다. 그리고 Java는 그런 API를 제공하지 않습니다. –
@Suraj : 달성하고자하는 것은 분명히 질문에 명시되어 있습니다. 목표는 EDT가 아닌 스레드에서 실행하는 것입니다. 당신이 알아 차렸 듯이, EDT에서 결코 뛰지 않기 위해서입니다. – SyntaxT3rr0r