集合做重复的操作,如果使⽤串⾏执⾏会相当耗时,因此⼀般会采⽤多线程来加快, Java8的paralleStream⽤fork/join框架提供了并发执⾏能⼒
底层原理
线程池(ForkJoinPool)维护⼀个线程队列
可以分割任务,将⽗任务拆分成⼦任务,完全贴合分治思想
public class Main {
public static void main(String[] args) throws Exception {
// 串行与并行的区别
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
numbers.stream().forEach(System.out::println); // 串行
numbers.parallelStream().forEach(System.out::println); // 并行,不会顺序执行
}
}
- paralleStream并⾏是否⼀定⽐Stream串⾏快?
错误,数据量少的情况,可能串⾏更快,ForkJoin会耗性能
不⾏,部分情况会有线程安全问题,parallelStream⾥⾯使⽤的外部变量,⽐如集合⼀定要使⽤线程安全集合,不然就会引发多线程安全问题
public class Main {
public static void main(String[] args) throws Exception {
for(int i=0;i<10;i++){
//List list = new ArrayList(); // 线程不安全,会报错
List list = new CopyOnWriteArrayList(); // 线程安全
IntStream.range(0,100).parallel().forEach(list::add);
System.out.println(list.size());
}
}
}
public class Main {
public static void main(String[] args) throws Exception {
// Stream.of()方法创建stream流;返回相加的值
int value = Stream.of(1, 2, 3, 4, 5).reduce((item1, item2) -> item1 + item2).get();
System.out.println(value);
// 返回相加的值,不适用lambda表达式的写法
int value = Stream.of(1, 2, 3, 4, 5).reduce(new BinaryOperator<Integer>() {
@Override
public Integer apply(Integer integer, Integer integer2) {
return integer+integer2;
}
}).get();
System.out.println(value);
// 返回相加的值,方式2
int value = Stream.of(1, 2, 3, 4, 5).reduce(100,(item1,item2)->item1+item2);
System.out.println(value);
// 返回最大值
int value = Stream.of(1645, 234345, 32, 44434, 564534, 435, 34343542, 212)
.reduce((item1, item2) -> item1 > item2 ? item1 : item2).get();
System.out.println(value);
}
}
public class Main {
public static void main(String[] args) throws Exception {
// forEach使用
List<String> list = Arrays.asList("sdfsdf","xxxx","bbb");
// 写法1
list.forEach(obj->System.out.println(obj));
// 写法2
list.forEach(System.out::println);
});
}