【发布时间】:2022-01-15 05:29:39
【问题描述】:
我正在运行多个这样的服务: (例如多线程读取文件)
for (int i = 0; i < 3; i++) {
ReadService readService = new ReadService();
readService.start();
}
//wait until all services have been completed
System.out.println("All services done!");
ReadService 是一个扩展 Service 类的类,它正在做一些事情,比如读取文件。
它是从另一个不是 JavaFX 应用程序线程的线程调用的。
我怎样才能等到所有这些服务都完成后再致电System.out.println?
可重现的例子:
import javafx.application.Application;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.stage.Stage;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) {
for (int i = 0; i < 3; i++) {
ReadService readService = new ReadService();
readService.start();
}
// wait until all services have been completed
System.out.println("Services done");
// continue with some other code, for example check the read file on anything
}
public static void main(String[] args) {
launch();
}
}
class ReadService extends Service<Boolean> {
@Override
protected Task<Boolean> createTask() {
return new Task<>() {
@Override
protected synchronized Boolean call() throws Exception {
// do something, for example read a file
System.out.println("wait...");
wait(5000);
System.out.println("waiting done");
return null;
}
};
}
}
【问题讨论】:
-
这个问题需要更多的上下文。
ReadService是什么?这段代码在哪里被调用(例如,因为这个问题标记为 javafx,它在 FX 应用程序线程上)?完成所有服务后,您想做什么? (更新用户界面?还有别的吗?)理想情况下,创建并发布minimal reproducible example。 -
@James_D 我用一个可重现的例子更新了我的帖子。我不是从 JavaFX 线程调用服务,而是从 JavaFX 线程调用的线程调用服务。服务完成后,我正在对读取的文件做一些事情(比如验证、创建对象......)。希望现在更清楚了
-
不要使用服务,使用三个任务来完成工作,任务是futuretask的子类,所以你可以对它们调用get()来等待它们完成。但是不要在 FX 线程上调用 get(),而是创建一个运行 3 个子任务的第 4 个控制任务,并在所有子任务上调用 get 以暂停直到完成。使用来自执行者的工作窃取池执行您的任务。
标签: java multithreading javafx service