当前位置: 首页 > 知识库问答 >
问题:

JavaFX多线程

林星华
2023-03-14

我在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的不同建议得出这个解决方案的)

共有1个答案

归翔
2023-03-14

为什么不做呢

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,然后是对存储数据的实际大量计算。允许用户选择多个文件,并且由于文件处理不依赖于所选的任何其他文件,因此使我的工作变得更加轻松。 此外,用户需要具有按钮列表,每个要取消的任务一个按钮以及“全部取消”按钮。因此,我必须考虑选择性或集体杀死一项或所有任务的能力。 最后一个要求是,我不允许用户