2017-05-17 3 views
2

현재 스레드 안전을 위해 만든 응용 프로그램을 리팩토링하고 있습니다.JCheckBox.isSelected() 스레드는 안전합니까?

나는 확인해야 할 JCheckBox이 있습니다. 이 JCheckBox은 다양한 스레드에서 프로그램 전체에서 참조됩니다.

간단히 checkbox.isSelected()으로 전화를 걸거나 invokeLater을 사용하여이 전화를해야합니까?

일반적으로 동시성을 이해하는 것이 어렵다는 것을 알고 있지만 천천히 그러나 확실하게 거기에 있습니다. 이것이 어리석은 질문이라면 왜 내 이해를 향상시킬 수 있는지 말해주십시오.

감사합니다.

+0

내가 완전히 확실하지 않다, 그러나에 isSelected()가 순수 확인란을 변경하지 않고 값을 반환해야합니다 고려, 당신은해야한다 invokeLater를 사용하지 않아도됩니다. –

+0

방금 ​​[이 답변] (http://stackoverflow.com/a/1796687/1799530), 아니라고 대답 – SomeJavaGuy

+0

당신은'EDT' 밖에서'isSelected()'를 호출합니까? 예를 들어 액션 리스너에서 일부 처리를 수행하는 경우 문제가 없습니다. 만약 당신이'isSelected()'를 정규 코드에서 호출한다면, 그것은 설계상의 문제가 더 많고,'invokeLater()'는 어쨌든 그것을 고칠 수있는 적절한 방법이 아닐 것이라고 말하고 싶습니다. – Kayaman

답변

1

아니요, 스레드로부터 안전하지 않습니다. 스윙은 일반적으로 스레드로부터 안전하지 않습니다. invokeLater을 사용해야합니다. 반면에, 당신이 invokeLater 마감 작업까지 현재 스레드를 대기 할 수 있습니다

private boolean isSelected(final AbstractButton button) { 
    if (SwingUtilities.isEventDispatchThread()) { 
     // a shortcut so the AWT thread won't wait for itself 
     return button.isSelected(); 
    } 
    final AtomicBoolean isSelected = new AtomicBoolean(); 
    final CountDownLatch latch = new CountDownLatch(1); 
    SwingUtilities.invokeLater(() -> { 
     try { 
      isSelected.set(button.isSelected()); 
     } finally { 
      latch.countDown(); 
     } 
    }); 
    try { 
     latch.await(); 
    } catch (InterruptedException e) { 
     throw new RuntimeException(e); 
    } 
    return isSelected.get(); 
} 
관련 문제