JCheckBox.isSelected() 线程安全吗?

Is JCheckBox.isSelected() thread safe?

我目前正在重构我制作的线程安全的应用程序。

我有一个 JCheckBox 需要检查。此 JCheckBox 在整个程序中的各种不同线程中被引用。

我可以直接调用 checkbox.isSelected() 还是必须使用 invokeLater 来调用?

我发现很难理解一般的并发性,但我正在缓慢但肯定地到达那里。如果这是一个愚蠢的问题,请告诉我为什么这样我可以更好地理解。

谢谢。

不,它不是线程安全的。 Swing 通常不是线程安全的。您需要使用 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();
}