Java异步写map_多线程 – 异步填充Java Map并将其作为未来返回

我有一个对象的地图,这些对象的创建成本很高,所以我想创建对象并与我的应用程序中的其他进程并行填充地图.只有当主线程实际需要访问映射时,应用程序才会等待填充映射的异步任务完成.我怎样才能最优雅地完成这项工作?

目前的做法

目前,我能够在下面的示例代码中使用CompletableFuture.runAsync(Runnable, Executor)类似于异步创建地图本身中的每个单独对象,但我不确定如何构建Future / CompletableFuture类型机制,以便在准备好时返回Map本身:

public static class AsynchronousMapPopulator {

private final Executor backgroundJobExecutor;

public AsynchronousMapPopulator(final Executor backgroundJobExecutor) {

this.backgroundJobExecutor = backgroundJobExecutor;

}

public ConcurrentMap apply(final Map input) {

final ConcurrentMap result = new ConcurrentHashMap<>(input.size());

final Stream.Builder> incrementingJobs = Stream.builder();

for (final Entry entry : input.entrySet()) {

final String className = entry.getKey();

final Integer oldValue = entry.getValue();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用多线程异步操作实现集合的异步刷新。 一种方法是使用Java的线程池来异步执行集合刷新操作。可以使用ExecutorService类来创建线程池,并将需要异步刷新的集合对象包装为Callable对象以便能够提交给线程池执行。在Callable对象的call()方法中执行集合刷新操作,然后将结果返回。 另一种方法是使用Java 8中的CompletableFuture类来异步执行集合刷新操作。可以使用CompletableFuture.supplyAsync()方法将需要异步刷新的集合对象包装为Supplier对象,然后在异步线程中执行集合刷新操作,并返回结果。可以使用CompletableFuture.thenAccept()方法在主线程中处理异步结果。 以下是一个示例代码: ```java import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class AsyncCollectionRefresh { private List<String> list = new ArrayList<>(); private ExecutorService executor = Executors.newSingleThreadExecutor(); public AsyncCollectionRefresh() { list.add("item1"); list.add("item2"); list.add("item3"); } public void refresh() { Callable<List<String>> callable = () -> { // Simulate refresh operation Thread.sleep(1000); List<String> newList = new ArrayList<>(); newList.add("item4"); newList.add("item5"); newList.add("item6"); return newList; }; Future<List<String>> future = executor.submit(callable); try { list = future.get(); System.out.println("List refreshed: " + list); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { AsyncCollectionRefresh asyncCollectionRefresh = new AsyncCollectionRefresh(); asyncCollectionRefresh.refresh(); } } ``` 该示例中,通过Callable对象异步执行集合刷新操作。在模拟的刷新操作中,新建了一个List对象,然后将其赋值给集合对象。最后在主线程中输出刷新后的集合内容。 另外,也可以使用Java 8中的Stream API来进行集合的异步处理。使用Stream.parallel()方法可以将集合转换为并行流,从而实现多线程并发处理。但这种方法不太适用于集合的刷新操作,因为它需要重新创建一个新的流对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值