gpt4 book ai didi

java - 在单独的线程中运行一个进程,以便 Java FX 应用程序的其余部分可用?

转载 作者:行者123 更新时间:2023-11-30 06:06:17 24 4
gpt4 key购买 nike

我目前正在创建一个 Java 应用程序,其 UI 使用 Java FX 创建。我的应用程序界面分为三个独立的选项卡。在第一个选项卡上,我有很多启动其他应用程序的按钮。我的目标是让用户按特定顺序启动这些应用程序,以便在前一个应用程序的进程完成之前禁用后续按钮,然后启用它们。我已经通过使用行来完成此操作

Process p = Runtime.getRuntime().exec(application);
p.waitFor();

然后 Controller 启用界面中的下一个按钮。我的问题出现在启动的应用程序运行时。由于我的应用程序等待进程结束,任务管理器显示我的 Java 应用程序没有响应,您无法导航到其他选项卡。当然,当启动的应用程序完成时,我的应用程序运行正常。

我认为这是由于主线程在等待进程完成时被阻塞。最好的解决方案是在单独的线程上运行此进程,以便在等待启动的进程完成时应用程序的其余部分可用吗?

最佳答案

I was thinking that it's due to the main thread being blocked as it's waiting on a process to finish.

这是正确的。

Is it possible to run this process on a seperate thread so the rest of the application is usable while waiting on a launched process to finish?

当然可以。最简单的做法就是在单独的线程上启动它:

Process p = Runtime.getRuntime().exec(application);
new Thread(p::waitFor).start();

但是,您可能还需要更多:例如在新线程完成时收到通知等。JavaFX 提供了一个 concurrency API它具有针对您执行的任务的生命周期的回调。这些回调在 FX 应用程序线程上执行,因此在回调中更新 UI 是安全的(您不能从后台线程更新 UI)。

所以你可以做类似的事情

Task<Void> executeAppTask = new Task<Void>() {
@Override
protected Void call() throws Exception {
Process p = Runtime.getRuntime().exec(application);
p.waitFor();
return null;
}
};

executeAppTask.setOnSucceeded(e -> {
/* code to execute when task completes normally */
});

executeAppTask.setOnFailed(e -> {
Throwable problem = executeAppTask.getException();
/* code to execute if task throws exception */
});

executeAppTask.setOnCancelled(e -> {
/* task was cancelled */
});

Thread thread = new Thread(executeAppTask);
thread.start();

请注意,setOnSucceeded()setOnFailed()setOnCancelled() 处理程序在 FX 应用程序线程上执行,因此,同样,在这些处理程序中更新 UI 是安全的。另请注意,调用 executeAppTask.cancel() 将中断运行任务的线程,如有必要,这将正确中断 waitFor() 方法。因此,您将(或多或少)通过调用 executeAppTask.cancel() 立即调用 setOnCancelled 处理程序。如果 call() 方法中有代码在 调用阻塞方法(例如 waitFor())后执行,它可能会捕获中断的异常并检查 isCancelled() 标志,如果任务已被取消则正常退出。

参见 Task API docs更多示例。

关于java - 在单独的线程中运行一个进程,以便 Java FX 应用程序的其余部分可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44398611/

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