1、什么叫做并行?什么叫做并发?
- <b>并行</b>:多个任务在同一个时刻发生。
- <b>并发</b>:多个任务无法在同一个时刻发生,但这个时间段已经存在多个任务同时启动了。CPU给他们分配不同的时间片去运行。——并发
2、什么叫做数据并行化?什么叫做任务并行化?
- <b>数据并行化</b>:将数据分块,为每块数据分配单独的处理单元上。
- <b>任务并行化</b>:在这个模型中,每一个线程执行一个分配到的任务,而这些线程则被分配(通常是操作系统内核)到该并行计算体系的各个计算节点中去。
3、并行化代码
package com.tinygao.thread.stream;
import com.google.common.base.Stopwatch;
import lombok.extern.slf4j.Slf4j;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;
import static com.google.common.collect.ImmutableList.of;
/**
* Created by gsd on 2017/1/25.
*/
@Slf4j
public class ParallelStreamTest {
public static void main(String[] args) {
List<String> tinygao1 = new ArrayList<>();
List<String> tinygao2 = new ArrayList<>();
List<String> tinygao3 = new ArrayList<>();
initList(tinygao1, tinygao2, tinygao3);
Stopwatch s = Stopwatch.createStarted();
int lengthNum = Stream.of(tinygao1,tinygao2,tinygao3)
.flatMap(x-> x.stream())
.mapToInt(x->x.length())
.sum();
log.info("lengthNum :{} , waster : {} ms",
lengthNum,
s.elapsed(TimeUnit.MILLISECONDS));
/*集合类都有parallelStream方法,实现并行化*/
s.reset().start();
int parallelLengthNum = Stream.of(tinygao1,tinygao2,tinygao3)
.flatMap(x-> x.parallelStream())
.mapToInt(x->x.length())
.sum();
log.info("parallelLengthNum :{} , waster : {} ms",
parallelLengthNum,
s.elapsed(TimeUnit.MILLISECONDS));
s.stop();
}
private static void initList(List<String> tinygao1,
List<String> tinygao2,
List<String> tinygao3) {
for(int i = 0; i < 5000000; i++) {
tinygao1.add("tinygao1"+i);
tinygao2.add("tinygao2"+i);
tinygao3.add("tinygao3"+i);
}
}
}
4、结果
lengthNum :221666670 , waster : 341 ms
parallelLengthNum :221666670 , waster : 138 ms