我在JavaFx应用程序中面临一个问题。
前言:我不想具体到我的应用程序,而是想概括,这样像我这样的人就会对类似的情况有所了解。
背景:使用fxml文件和多线程概念实现一个Javafx应用程序。
总结:我试着做了一个应用程序,它基本上使用多线程来做一些任务,一旦多线程完成,它就会依次移动到另一个任务。在执行多线程操作时,主GUI会冻结。
我的所作所为,
//This is Main class
Parent Root -> defined on top
public Parent createContent(){
try{
root = FXMLLoader.load(getClass().getResource("Layout.fxml"));
}catch { .....}
}
public void start(){
stage.setScene(new Scene(createContent()));
Task<Void> task = new Task<Void>() {
@Override
public Void call() throws Exception {
Thread.sleep(1000);
return null ;
}
};
task.setOnSucceeded(event->{
stage.show();
});
new Thread(task).run();
}
public static void main(String[] args) {
launch(args);
}
// This is inside the controller on button click event
@FXML
private void start(ActionEvent event) { <---- This one is button click event
Thread t1 = new Thread(new Mul());
t1.start();
Thread t2 = new Thread (new Mul());
t2.start();
}
// Finally
public class Mul implements Runnable {
public void type() {
for (int a = 0; a < 200000; a++) {
System.out.println( Thread.currentThread().getName()+ " says " + a);
}
}
@Override
public void run() {
type();
}
}
现在,结果是这样的。如果我只是从控制器启动线程,那么当线程在后台运行时,我的主应用程序不会冻结。但是,由于应用程序是按顺序运行的,也就是说,下一个步骤只有在线程完成它们的工作时才起作用
我可以使用t1.join()和t2.join(),但是这样做会冻结我的主应用程序(这里的主应用程序是主GUI),并且在线程完成之前我不能继续使用它。
最优的解决方案是什么,这样我就可以使用多线程而不阻塞主应用程序,或者我在这里做错了什么?(信息,我是通过跟踪Stack overflow和google的不同建议得出这个解决方案的)
为什么不做呢
Task<Void> task = new Task<Void>() {
@Override
public Void call() {
Mul m1 = new Mul();
m1.run();
Mul m2 = new Mul();
m2.run();
return null ;
}
};
new Thread(task).start();
如果您确实想“链接”不同的任务,请从另一个的OnSuccessed
处理程序调用其中一个:
Task<Void> task1 = new Task<Void>() {
@Override
public Void call() {
new Mul().run();
return null ;
}
};
Task <Void> task2 = new Task<Void>() {
@Override
public Void call() {
new Mul().run();
return null ;
}
};
task1.setOnSucceeded(e -> new Thread(task2).start());
new Thread(task1).start();
显然,如果您使mul
成为task
子类而不是runnable
,这会更好,而且最好使用带有后台进程线程等的executor
。
我有两个交织在一起的多线程问题。 我在使用spring boot的JavaFX桌面应用程序中有一个SplitPane。左边是树视图,右边是选项卡窗格。开始时,SplitPane设备位于右侧边缘,隐藏了TabPane。当用户在树中选择一个项目时,两件事将同时发生: 首先,根据选择,创建10个选项卡。选项卡因所选对象而异。每个选项卡都显示与选定对象相关的详细数据。大多数选项卡包含图表,但也包含文本。
我需要在 JavaFX 应用程序的后台使用多个线程。我有一个带有十个按钮的屏幕,我需要将每个线程与启动线程的按钮“绑定”在一起。如果用户按下了启动线程的按钮(在主屏幕中,MainController.java),我需要恢复它以显示包含的信息,以在详细信息屏幕(第二个屏幕,DetailController.java)的控件上显示它。 你推荐什么课程?服务? https://docs.oracle.c
主要内容:JavaFX多边形折线JavaFX多边形折线 多边形,一个简单的示例代码如下所示 - 上面的代码生成以下结果。 折线示例,一个简单的示例代码如下所示 - 上面的代码生成以下结果。
问题内容: 我有一个简单的JavaFX 2应用程序,带有2个按钮,分别是“开始”和“停止”。单击开始按钮后,我想创建一个后台线程,该线程将进行一些处理并随着时间的推移更新UI(例如进度条)。如果单击停止按钮,我希望线程终止。 我尝试使用从文档中收集的类来完成此操作。但是,每当我单击“开始”时,UI就会冻结/挂起,而不是保持正常。 她是来自主类的用于显示按钮的代码: 这是类的代码: 相当简单,但是每
我正在开发一个java应用程序,其中我使用java swing窗体和javafx FXML stage,我对javafx是新手,现在我在应用程序中调用具有控制器的javafx FXML stage,从swing窗体调用FXML stage,单击如下按钮----application.launch(myfxml.class); 下面的代码片段用于调用swing表单-- 我得到的异常是“应用程序启动必
问题内容: 我可以选择让用户从FileChooser提交多个文件,以通过一些代码进行处理。结果将是读取文件的IO,然后是对存储数据的实际大量计算。允许用户选择多个文件,并且由于文件处理不依赖于所选的任何其他文件,因此使我的工作变得更加轻松。 此外,用户需要具有按钮列表,每个要取消的任务一个按钮以及“全部取消”按钮。因此,我必须考虑选择性或集体杀死一项或所有任务的能力。 最后一个要求是,我不允许用户