Возвращает тип данных исходного метода

#java

#java

Вопрос:

Например, у меня есть метод, который возвращает логическое значение, и я создаю там новый поток, трудно вернуть логическое значение в потоке.

Позвольте мне показать вам, что я имею в виду на этом примере:

 public boolean test() {
    int a = 5;
    int b = 3;

    new Thread(() -> {
        if (a > b) {
            return true; //NOT POSSIBLE
        } else {
            return false;
        }
    }).start();
}
 

Это всего лишь пример. Это не сработало бы, мне нужно было бы сделать что-то вроде этого:

 private boolean value;

public boolean test() {
    int a = 5;
    int b = 3;

    new Thread(() -> {
        if (a > b) {
            value = true;
            return;
        } else {
            value = false;
            return;
        }
    }).start();

    return value;
}
 

Теперь мои вопросы: есть ли способ, который проще, чем thies? Это может привести к беспорядку, если у меня будет больше таких методов в классе.

С уважением

Комментарии:

1. test должен быть асинхронным и ждать результата вашего внутреннего потока

2. Возможно, вы захотите взглянуть на CompletableFuture .

Ответ №1:

То, что вы хотите, называется фьючерсами, посмотрите на некоторые примеры https://www.baeldung.com/java-future

Или для java 8 и более поздних версий CompletableFuture https://www.baeldung.com/java-completablefuture , в руководстве также есть пример того, как дождаться нескольких значений одновременно.

По сути, вы предоставляете обещание значения, и получатель может проверить, доставил ли фоновый поток уже значение и / или подождать, пока это не будет сделано.

Ваш пример может выглядеть примерно так:

 public boolean test() throws Exception {
    int a = 5;
    int b = 3;

    CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(() -> {
        if (a > b) {
            return true;
        } else {
            return false;
        }
    });
    return future.get();
}
 

Ответ №2:

Когда вы запускаете новый поток, текущий метод может завершиться ( return value ) раньше, чем это сделает новый поток.

Один из способов получить результат — вызвать из вашего нового потока некоторый метод экземпляра прослушивателя (обычно actionPerformed ActionListener), который вы должны передать в качестве параметра при вызове вашего test()-метода.

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