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