많은 곳에서 UI 구성 요소를 업데이트 할 때 (특히 Java Swing에서 Event Dispatch Thread에 있음 ) UI 스레드에 있는지 확인하는 것은 호출자의 책임이라는 것이 정식적인 지혜 1 임을 알았 습니다. .
왜 그렇습니까? 이벤트 디스패치 스레드는 MVC / MVP / MVVM 의 관점 에서 중요합니다 . 뷰를 어디에서나 처리하기 위해 뷰 는 뷰의 구현과 해당 뷰 구현의 스레딩 모델 사이에 긴밀한 연결을 만듭니다 .
특히 Swing을 사용하는 MVC 아키텍처 응용 프로그램이 있다고 가정 해 봅시다. 호출자가 Event Dispatch Thread에서 구성 요소를 업데이트해야하는 경우 JavaFX 구현을 위해 Swing View 구현을 교체하려고하면 대신 모든 Presenter / Controller 코드를 변경하여 JavaFX Application 스레드를 대신 사용해야합니다 .
따라서 두 가지 질문이 있다고 가정합니다.
- UI 구성 요소 스레드 안전을 보장하는 것은 호출자의 책임 인 이유는 무엇입니까? 위의 추론에서 결함은 어디에 있습니까?
- 이러한 스레드 안전 문제를 느슨하게 결합하면서도 스레드 안전을 유지하도록 응용 프로그램을 어떻게 설계 할 수 있습니까?
"호출자 책임"의 의미를 설명하기 위해 MCVE Java 코드를 추가하겠습니다 (여기서는 수행하지 않지만 가능한 최소한의 목적으로 노력하고있는 다른 좋은 방법이 있습니다).
발신자 책임 :
public class Presenter {
private final View;
void updateViewWithNewData(final Data data) {
EventQueue.invokeLater(new Runnable() {
public void run() {
view.setData(data);
}
});
}
}
public class View {
void setData(Data data) {
component.setText(data.getMessage());
}
}
책임보기 :
public class Presenter {
private final View;
void updateViewWithNewData(final Data data) {
view.setData(data);
}
}
public class View {
void setData(Data data) {
EventQueue.invokeLater(new Runnable() {
public void run() {
component.setText(data.getMessage());
}
});
}
}
1 : 해당 게시물의 작성자가 Swing on Stack Overflow에서 태그 점수가 가장 높습니다. 그는 여기저기서 이것을 말하고 다른 곳에서도 발신자의 책임 인 것을 보았다.