2013-12-15 6 views
2

나는 자바 FX 속성에 onChange가 리스너를 추가하는 경우,자바 FX 속성 리스너는

  1. 는 청취자 순서대로 호출, 순서화? 문자열 속성이 있고 그 다음 "앨리스"와 "밥"의 문자열이있는 경우 "Bob"이 표시되기 전에 "앨리스"를 볼 수 있습니다. 사실, "Bob"을 본 후에 볼 수없는 한 "Alice"가 보이는지 상관하지 않습니다.
  2. 리스너가 순차적으로 호출 되었습니까? 청취자가 "Alice"및 "Bob"통지에 의해 동시에 호출 될 수 있습니까?

답변

2

참고 : 질문은 명확하지 않습니다. 리스너가 호출되는 순서가 아니라 이벤트가 관찰되는 순서에 대해 묻는 것 같습니다 (예제에는 하나의 수신기 만 있음). 이벤트 주문 부분에 대한 답변을 드리겠습니다.

짧은 이야기 : FX 속성은 스레드로부터 안전하지 않습니다. FX 쓰레드 내에서 프로퍼티를 작업하는 한, 이벤트는 순서대로 트리거되지만, 다른 쓰레드로부터 프라퍼티에 접근하면 쓰레드 안전의 일반적인 규칙이 적용됩니다. 즉

:

  • 재산은 당신이 당신의 청취자 또는 경우를 등록 할 때를 포함하여 (인해 사용자 상호 작용에 변경하는 컨트롤의 속성에 대한 경우 임) FX 스레드에서 액세스하는 경우 프로그래밍 방식으로 속성 값을 설정하면 이벤트가 FX 스레드에서 트리거되고 순서대로 나타납니다. 따라서 사용자가 Alice와 Bob을 입력하면 청취자는 Alice와 Bob을 수신합니다.
  • 속성을 만들거나 컨트롤의 속성을 수동으로 업데이트했지만 동기화를 제대로 수행하지 않으면 스레드로 재생하기 시작하면 모든 베팅이 해제됩니다. 스레드에서

    • property.addListener(myListener) 스레드 C에서 스레드 B
    • property.set("Bob")에서
    • property.set("Alice")

    또는 "앨리스"를 참조하지 않을 수도 있습니다 리스너를 그것은 할 수있다 : 특히, 작성하는 경우 또는 "Bob"이 보이지 않을 수도 있습니다. 실제로 "앨리스"는 볼 수 있지만 "밥"은 볼 수 없으며 "밥"은 볼 수 있지만 "앨리스"는 볼 수 없습니다.

+0

기본적으로, 나는 listener가 실행될 thread 인 property.addListner (myListener)를 요구하고있었습니다. 리스너가 FXThread에서 실행되는 것처럼 들리지만 (내게 뭔가 빠져있는 경우는 제외) 내 문제를 해결합니다. –

+1

속성을 직접 설정하지 않으면 리스너가 fx 스레드에서 호출된다는 것을 안전하게 가정 할 수 있습니다. 의심스러운 경우 fx 스레드에 있음을 청취자가 확인할 수 있습니다. – assylias