在这篇文章中,一个非常简单的转换操作将被应用于一个大型的Java数据集合。
转换操作
对于转换操作,我们定义了一个函数接口。它只是接收一个R类型的元素,应用一个转换操作,并返回一个S类型的转换对象。
@FunctionalInterface
<b>public</b> <b>interface</b> ElementConverter<R, S> {
S apply(R param);
}
我们创建了ElementConverter接口的两个实现,其中一个将一个字符串转换为一个大写的字符串。
<b>public</b> <b>class</b> UpperCaseConverter implements ElementConverter<String, String> {
@Override
<b>public</b> String apply(String param) {
<b>return</b> param.toUpperCase();
}
}
<b>public</b> <b>class</b> CollectionUpperCaseConverter implements ElementConverter<List<String>, List<String>> {
@Override
<b>public</b> List<String> apply(List<String> param) {
<b>return</b> param.stream().map(String::toUpperCase).collect(Collectors.toList());
}
}
还实现了一个 异步 执行器(AsynchronousExecutor)类,除了一些其他辅助性的方法外,还为并行处理策略提供了一个专门的方法。
<b>public</b> <b>class</b> AsynchronousExecutor<T, E> {
<b>private</b> <b>static</b> <b>final</b> Integer MINUTES_WAITING_THREADS = 1;
<b>private</b> Integer numThreads;
<b>private</b> ExecutorService executor;
<b>private</b> List<E> outputList;
<b>public</b> AsynchronousExecutor(<b>int</b> threads) {
<b>this</b>.numThreads = threads;
<b>this</b>.executor = Executors.newFixedThreadPool(<b&

文章探讨了两种并行处理Java大型数据集合的方法:基于子列表分区和浅层分割。子列表分区策略将源集合分割成子列表,线程独立处理后同步添加到输出列表。浅层分割策略则不复制源集合,线程直接在源集合上读取并转换对象,存储在新集合中。测试表明,这两种策略在多线程环境下能有效提升处理速度,最高加速比可达4.4X。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



