gpt4 book ai didi

java - 如何使用 java 8 Lambdas 和线程池实例化对象或调用 setter 以传递来自不同线程的值?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:06:50 24 4
gpt4 key购买 nike

我有这样的老式代码:

ObjectToInstantiate instance = new ObjectToInstantiate();
Thread getFirstValueThread = new Thread(() -> instance.setFirstValue(service.getFirstValue));
Thread getSecondValueThread = new Thread(() -> instance.setSecondValue(service.getSecondValue));

getFirstValueThread.start();
getSecondValueThread.start();

try {
getFirstValueThread.join();
getSecondValueThread.join();
} catch (InterruptedException e) {
throw new RuntimeException(e.getMessage(), e);
}
return instance;

FirstValue 和 SecondValue 是不同的类,我也可以将它们传递给构造函数,而不仅仅是 setter。

我如何使用 ExecutorService 或其他方式来避免创建新线程?

最佳答案

看看CompletableFutures其设计理念是在给定时间段后返回值。您还可以轻松管理异常情况。

CompletableFuture<FirstValue> f1 = CompletableFuture.supplyAsync(() -> service.getFirstValue());
CompletableFuture<SecondValue> f2 = CompletableFuture.supplyAsync(() -> service.getSecondValue());

CompletableFuture<ObjectToInstantiate> combineFuture = f1.thenCombine(f2, (firstValue, secondValue) -> new ObjectToInstantiate (firstValue, secondValue));
ObjectToInstantiate myObject = combineFuture .join();

这是在创建 2 个返回值的异步线程。 f1.thenCombine 在它们成功完成时获取两者的值,并结合两者的值来创建新对象。

您现在没有使用方法的副作用,而是实际返回并移动值来创建新对象。

还取决于你如何在你的对象上使用你的构造函数

f1.thenCombine(f2, ObjectToInstantiate::new);

您也可以为异步方法执行此操作

CompletableFuture.supplyAsync(service::getFirstValue)

此外,如果您已经有一个执行者服务,您可以更改

CompletableFuture.supplyAsync(() -> service.getFirstValue);

CompletableFuture.supplyAsync(() -> service.getFirstValue, myExecutorService);

关于java - 如何使用 java 8 Lambdas 和线程池实例化对象或调用 setter 以传递来自不同线程的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42416530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com