我正在使用JavaFX编写应用程序,我的理解是,当UI在一个线程中运行时,所有其他非UI操作必须在另一个中运行。到目前为止,我发现的所有示例都是以下内容的变体:
myButton.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent a) {
// Some UI operations
new Thread() {
public void run() {
// Some non-UI operations
Platform.runLater(new Runnable() {
public void run() {
// Some operations to update the UI
}
});
}
}.start();
}
});
我的问题是:你是否需要以某种方式杀死线程以释放其资源?在示例中,我从来没有人似乎使用Thread.join或任何其他类似的方法。
另外,建议像这样使用setDaemon吗?
myButton.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent a) {
// Some UI operations
final Thread child = new Thread() {
public void run() {
// Some non-UI operations
Platform.runLater(new Runnable() {
public void run() {
// Some operations to update the UI
}
});
}
};
child.setDaemon(true);
child.start();
}
});
注意: 根据这个线程(JavaFX multithreading - joining threads won't update the UI),不能使用Thread.join,但它似乎没有解决不再需要的线程或者如何杀死它们的问题。
答案 0 :(得分:0)
当没有安排任何线程时,线程将会老化。但是,依赖于此并不是一个好习惯,因为它可能占用资源。
更好的方法是使用ExecutorService
,如the documentation中所述。 ThreadPoolExecutor
可以运行一个或多个线程。您可以使用相同的执行程序继续提交可运行的任务,它们将在它管理的线程上执行。该文档提供了有关如何在应用程序结束时关闭执行程序服务的示例。如果您确信没有执行任何未完成的任务,可以发出shutdownNow()
以立即清理所有线程。