gpt4 book ai didi

JavaFX .Join() 关键字导致应用程序卡住一段时间

转载 作者:行者123 更新时间:2023-12-01 18:00:33 25 4
gpt4 key购买 nike

我有几行代码需要在运行Thread完成时执行。因此,我在稍后要执行的代码之前使用了 thread.join() 关键字。

当我使用 join() 关键字运行程序时,我的应用程序界面会卡住,直到线程执行完成。我该如何克服这个问题..?

实际上我的程序正在做的是,一旦我按下按钮,它将执行方法调用 Pass_data_from_java_to_report(); 并且在运行时,会出现一个单独的 View 或 Stage通知用户程序仍在运行。一旦上述方法完成执行,等待的Stage将通过调用stage.close()关闭。这些操作工作正常,但使用 join 关键字会卡住。

这是我的第一个方法。

if(event.getSource() == btnAdd){

Stage stage = Waiting(); // Returns Waiting Message
Task <Void> task = new Task<Void>() {

@Override
protected Void call() throws Exception {
Pass_data_from_java_to_report(); // My Method
return null;
}

};
// Displaying Waiting Message
task.setOnRunning(eve -> {
stage.show();
});

// Closing Waiting Message
task.setOnSucceeded(e -> {
stage.close();
});

// Thread for executing task
Thread t1 = new Thread(() -> {
task.run();
});

t1.start();
t1.join(); // if i remove this buddy, there is no freezing

// below from here i want to execute upon thread completion
System.out.println("Finish ");

}

第二种方法

if(event.getSource() == btnAdd){

Stage stage = Waiting();

Thread t1 = new Thread(() -> {
Platform.runLater(() -> {
stage.show();
});
});

Thread t2 = new Thread(() -> {
Pass_data_from_java_to_report(); // My Method
Platform.runLater(() -> {
// Closing the Stage running on another thread upon Above Method Completion
stage.close();
});
});

t1.start();
t2.start();

t1.join(); // These are the Problems
t2.join(); // this one too

System.out.println("Finish ");

}

方法如下

     public void Pass_query_to_report(){    
try {
// Since method is not time consuming,
// i added 3 sec sleep before the Execution
Thread.sleep(3000);
/*
Some cord

*/
} catch (Exception e) {
e.printStackTrace();
}

}
  1. 我怎样才能克服这个问题..?
  2. 哪种方法最好使用..?是方法一还是方法二
  3. 按照我的方式关闭在另一个线程中启动的舞台是否安全?它会自动关闭属于它的线程吗..?

(注意 - 我也尝试使用 CountDownLatch 但没有运气)

最佳答案

Thread.join() 阻塞当前线程,直到指定线程完成。由于您在 FX 应用程序线程上调用它,该线程负责渲染 UI 和处理用户事件,因此它会阻塞该线程,导致 UI 无响应。

只需将任务完成后需要执行的代码移至 onSucceeded 处理程序即可:

if(event.getSource() == btnAdd){

Stage stage = Waiting(); // Returns Waiting Message
Task <Void> task = new Task<Void>() {

@Override
protected Void call() throws Exception {
Pass_data_from_java_to_report(); // My Method
return null;

}

};

// Displaying Waiting Message
task.setOnRunning(eve -> {
stage.show();
});

// Closing Waiting Message
task.setOnSucceeded(e -> {
stage.close();

// below from here i want to execute upon thread completion
System.out.println("Finish ");

});

// Thread for executing task
Thread t1 = new Thread(task);

t1.start();


}

关于JavaFX .Join() 关键字导致应用程序卡住一段时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41323341/

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