#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()-метода.
Основная идея запуска нового потока состоит в том, чтобы позволить некоторому времени пройти в длительном методе, пока ваша основная программа выполняет более неотложные задачи.