【发布时间】:2014-11-27 04:38:39
【问题描述】:
JavaFX 操作中的切换按钮将由 2 个单独的线程访问。
1. 一旦用户单击(切换按钮状态),就会调用一个线程,并将 a) 在操作系统中做某事 b) 检查 (a) 是否成功 c) 成功退出/退出并在失败时将切换按钮返回到之前的状态
2 另一个线程将监视与先前操作异步的事件,如果发生特定事件,它将更改按钮状态。
在锁定按钮状态方面,我是否需要在线程 1 和 2 之间提供同步?
编辑:James_D 提出的想法似乎是合理的,但我只是想提出一个替代方案(但其有效性仍有待证明)。 如何使用同步代码块,并使用锁定特定按钮的引用,例如:
// getting the reference to the button
@FXML
private ToggleButton tButtonToBeSynchronized
// Thread1
synchronized(tButtonToBeSynchronized) {
// do stuff with button upon user click
}
// Thread2
synchronized(tButtonToBeSynchronized) {
// poll system every X seconds
// when asynchronous event occurs (not related to UI events)
// update tButtonToBeSynchronized state
}
如果它们被不同的控制器类调用,这会起作用吗? (假设对 tButtonToBeSynchronized 的引用是通过引用传递的——而不是 FXML 框架的值传递?
【问题讨论】:
-
不,这行不通。您还需要 FX 库代码在按钮上进行同步。它没有 - 它假定您只从 FX 应用程序线程访问属于场景图一部分的节点。即使它确实“工作”了,在 Java 8 中,如果您尝试从另一个线程操作状态,也会在运行时抛出异常的显式检查。
标签: multithreading javafx synchronization togglebutton