【发布时间】:2018-11-02 17:29:34
【问题描述】:
今天的问题是:如何从另一个线程调用控制器函数。我的应用程序如下所示:
public class Server {
//(...)
public String setMsg(String string) {
msg.set(string+"\n");
mainScreenController.updateLog();
}
//(...)
while (true){
doThings();
}
}
public class MainScreenController {
//(...)
public void startServer(){
new Thread(server::start).start();
}
public void updateLog(){
Platform.runLater(()->{ testAreaLog.setText(testAreaLog.getText() + server.getMsg()); });
}
//(...)
}
我想在 finally 块中调用updateLog(),所以每次服务器更新msg GUI 都会将此消息添加到日志窗口。我的msg 是
private volatile AtomicReference<String> msg = new AtomicReference<String>();
当我在startServer() 中调用updateLog(); 时,它会显示第一条消息Starting server,正如您可能猜到的那样,但调用另一个updateLog(); 会返回null,所以我想在@987654331 之后直接调用它使用@。
【问题讨论】:
-
我无法理解您在这里要做什么。你想从
getMsg()和getMsg()从updateLog()调用updateLog()吗?这不会导致无限递归(假设其中一个在某个时候从您尚未发布的某些代码中调用)?为什么要在finally块中调用updateLog()?你的Server不是在单线程上运行吗?为什么msg需要AtomicReference?制作AtomicReferencevolatile绝对没有意义... -
抱歉,当然应该在
setMsg()内部。Server被称为另一个线程,我想与主 javaFX 线程同步以动态显示新的msg。volatileAtomicReference是不孕不育的孩子,试图实现同步。 -
为什么不让
updateLog(...)方法有一个字符串参数,直接把string传给它呢?那么您根本不必担心任何同步。 (事实上,可能没有理由将“最新消息”存储在Server实例中。) -
它不能工作,因为我在更新日志时发生了一些事情是另一个线程中的无限循环,所以
mainScreenController.updateLog2("LOL");只是冻结了服务器 -
您在问题中发布的任何内容都不会引起任何问题。
标签: multithreading javafx shared-variable