例如,我有一个返回布尔值的方法,并且我在那里创建了一个新线程,很难在该线程中返回布尔值。
让我告诉你这个例子的意思:
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;
}
现在我的问题是,有什么方法比蒂伊更容易?如果我在一个类中有更多类似的方法,这可能会变得混乱。
致谢
答案 0 :(得分:6)
您想要的叫做期货,看一些例子 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();
}
答案 1 :(得分:0)
启动新线程时,当前方法可能会在新线程之前完成(return value
)。
捕获结果的一种方法是从新线程中调用侦听器实例的某种方法(通常是ActionListener的actionPerformed),您应该在调用test()方法时将其作为参数传递。
启动新线程的基本思想是在主程序执行更紧迫的操作的同时,花一些时间来传递冗长的方法。