CompletableFuture.runAsync не завершает выполнение

avatar
E. Scott
8 апреля 2018 в 04:49
2490
1
0

Я пытаюсь использовать CompletableFuture для записи большого количества пикселей на холсте JavaFX, и мой метод, похоже, не завершает свою задачу, несмотря на отсутствие исключений.

Я новичок в асинхронном программировании и не знаю, с чего начать, но, судя по той информации, которую я собрал, это может сработать.

Я пытаюсь использовать:

CompletableFuture.runAsync(() -> {
                mandelbrot.increaseScale();
                drawMandelbrot();
            });

звонить:

private void drawMandelbrot() {
    //RENDER

    gc.clearRect(0,0,UISpecs.CANVAS_SIZE.getValue(),UISpecs.CANVAS_SIZE.getValue()); // clears canvas of any previously set pixels
    gc.setFill(Color.BLACK); // set canvas background to be black
    gc.fillRect(0,0,UISpecs.CANVAS_SIZE.getValue(),UISpecs.CANVAS_SIZE.getValue()); // set canvas background

    for(double a = -2; a <= 2; a+=.001) {
        for(double b = -2; b <= 2; b+=.001) {
            c = new Complex(a,b);
            col = pickColor(doIterations(c));
            p.setColor(mandelbrot.getX(a), mandelbrot.getY(b), col);
        }
    }
} // drawMandelbrot()

Мои методы complex(a,b) и pickColor(i) довольно тривиальны, оба выполняют очень маленькие и простые операции. Поэтому я считаю, что мои вложенные циклы вызывают мои проблемы.

Мы будем очень признательны за любые советы или комментарии.

Источник
Itai
8 апреля 2018 в 07:18
1

Предполагая, что gc является GraphicsContext, назначенным Canvas, который в настоящее время является частью графа сцены (отображается в любой сцене/окне), ваш код выдаст исключение при попытке изменить граф сцены из потока, отличного от поток JavaFX. Это исключение будет перехвачено методом CompletableFuture, и вы должны увидеть его с помощью метода get.

amritanshu
9 апреля 2018 в 11:16
1

Я предполагаю, что ваше приложение не закрывается до завершения вычислений. Несмотря на ваше заявление о том, что исключения не выдаются, я не вижу никаких проверок в вашем коде для их проверки, пожалуйста, добавьте CompletableFuture.runAsync().exceptionally() для проверки исключений.

Ответы (1)

avatar
zXor
8 апреля 2018 в 06:00
2

CompletableFuture — это реализация интерфейса Future. и вы хотите, чтобы ваши пиксели отображались на холсте асинхронно но вы не ждете, пока будущее завершит свои вычисления,

CompletableFuture<Void> completableFuture =CompletableFuture.runAsync(() -> {
                mandelbrot.increaseScale();
                drawMandelbrot();
            });
completableFuture.get();

В документации для CompletableFuture.get() ясно сказано: Ожидает завершения асинхронного вычисления, а затем возвращает

.