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();
}
我目前正在重构我制作的线程安全的应用程序。
我有一个 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();
}