gpt4 book ai didi

java - 了解 JavaFX WebView 线程模型

转载 作者:搜寻专家 更新时间:2023-11-01 03:06:35 29 4
gpt4 key购买 nike

我正在尝试了解 JavaFX 线程的工作原理。说明 here帮助不大。

例如在下面的代码中,打印顺序始终是 A 然后是 B 然后是 Z,这表明 load() 调用和 changed() 中的代码在同一个线程上运行。

但我不明白,为什么线程不会在最后一个Thread.sleep(2000) 之后退出(因为没有更多的工作要做)?

我希望 changed() 中的代码每次都在一个新线程上运行,但我完全不明白这是如何工作的!

public class Test extends Application {

@Override
public void start(Stage stage) throws Exception {

final WebView webView = new WebView();
Scene scene = new Scene(webView);
stage.setScene(scene);
stage.show();

webView.getEngine().getLoadWorker().stateProperty()
.addListener(new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov, State t, State t1) {
if (t1 == Worker.State.SUCCEEDED) {
System.out.println("Z"); // <---
}
}
});

webView.getEngine().load("http://www.google.com");

System.out.println("A"); // <---
Thread.sleep(2000);
System.out.println("B"); // <---
Thread.sleep(2000);
}

public static void main(String[] args) {
launch(args);
}
}

最佳答案

简答

start()changed() 从“JavaFX 应用程序线程”运行。此线程负责监视 UI 事件,将它们分派(dispatch)给用户代码并重新绘制 UI。与 Runnable.run() 不同,当退出时,线程终止,start() 由“JavaFX 应用程序线程”以类似于循环的方式调用:当 start() 结束,执行下一次迭代。 (实际上迭代是异步运行/等待事件,以免吃掉所有CPU资源,但循环作为简化模型是可以的。)

更长的答案

我会尝试更详细地解释。

将打印语句放置为(未缩进以突出显示):

    public void start(Stage stage) throws Exception {
System.out.println("2: " + Thread.currentThread().getName());
...
webView.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {
@Override
public void changed(ObservableValue<? extends State> ov, State t, State t1) {
if (t1 == Worker.State.SUCCEEDED) {
System.out.println("3: " + Thread.currentThread().getName());
System.out.println("Z"); // <---
}
}
});

webView.getEngine().load("...");

System.out.println("A"); // <---
Thread.sleep(2000);
System.out.println("B"); // <---
Thread.sleep(2000);
}

public static void main(String[] args) {
System.out.println("1: " + Thread.currentThread().getName());
launch(args);
System.out.println("4: " + Thread.currentThread().getName());
}

观察控制台和应用程序:

用户操作:启动应用
控制台:立即出现以下内容:

1: main
2: JavaFX Application Thread

应用程序:主窗口出现...但是没有内容!为什么?因为负责绘制 UI 的“JavaFX 应用程序线程”正在 sleep() 中,在点“A”之前。

控制台:2 秒后打印“A”
应用程序:仍在为“B” hibernate ,窗口中仍然没有内容

控制台:2 秒后打印“B”
应用:事物栩栩如生,内容开始填充; UI 线程不再阻塞在 sleep() 中,因此它可以自由地工作。

请注意,尽管 start() 已结束,但 launch() NOT,因此主线程仍然正常运行,因此应用程序处于 Activity 状态。片刻之后,页面加载完毕:

控制台:

3: JavaFX Application Thread
Z

用户操作:按下关闭
控制台:

4: main

应用:窗口关闭,应用退出

要更深入地了解这个主题,您可以在 main()start() 中放置断点,并观察 Activity 的各种线程。

评论:从 UI 线程中的 sleep() 调用中观察到的行为是您绝不能在 UI 线程中执行长时间运行的任务的原因,如果您愿意的话应用程序响应。

关于java - 了解 JavaFX WebView 线程模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20225264/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com