Передайте объект в метод runBench()
, который описывает, что вы хотите сделать с результатом. Поскольку вы инкапсулируете результат как String
, вы можете использовать Consumer<String>
:
public void runBench(Consumer<String> onAlgorithmCompletion) {
for (Algorithm a: listOfAlgorithms) {
double start = System.nanoTime();
a.run();
double end = System.nanoTime();
double result = end - start;
onAlgorithmCompletion.accept(
"Algorithm: " + a.getClass().getName() + "\n" +
"For N = " + a.getN() + " time is: " + result
);
}
}
Тогда с вашего контроллера вы можете сделать
@FXML
private void onRun() {
Utility.get().runBench(console::appendText);
}
Это не связано с вопросом, который вы разместили, но вам почти наверняка нужно выполнить свой метод runBench()
в фоновом потоке, поскольку, очевидно, для его выполнения требуется некоторое время. Если вы это сделаете, вам нужно убедиться, что консоль доступна только в потоке приложений FX. Приведенное выше решение легко изменить, чтобы сделать это (ваш runBench(...)
метод вообще не нуждается в изменении):
private Executor exec = Executors.newCachedThreadPool();
// ...
@FXML
private void onRun() {
exec.execute(() -> Utility.get().runBench(
result -> Platform.runLater(console.appendText(result))));
}