并行流
parallelStream.forEach()
Java8中新增了并行流,可以使用多线程进行并行操作,提高效率
但是因为是多线程的 输出顺序不一定是按照顺序的
@Test
public void t1(){
// java8新特性
List<Integer> list=new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
list
.parallelStream() //获得并行流
.forEach(i->System.out.println(Thread.currentThread().getName()+" -> "+i));
// ForkJoinPool.commonPool-worker-3 -> 2
// ForkJoinPool.commonPool-worker-3 -> 8
// ForkJoinPool.commonPool-worker-3 -> 10
// ForkJoinPool.commonPool-worker-7 -> 4
// ForkJoinPool.commonPool-worker-4 -> 6
// main -> 7
// ForkJoinPool.commonPool-worker-6 -> 1
// ForkJoinPool.commonPool-worker-2 -> 9
// ForkJoinPool.commonPool-worker-1 -> 3
// ForkJoinPool.commonPool-worker-5 -> 5
}
parallelStream().forEachOrdered()
按顺序输出
@Test
public void t2(){
List<Integer> list=new ArrayList<>(Arrays.asList(1,2,3,4,5));
list
.parallelStream() //获得并行流
.forEachOrdered(System.out::println); //保证顺序
// 1,2,3,4,5
}
Arrays 中用多线程进行排序
@Test
public void t3(){
int[]arr=new int[]{1,4,5,2,9,3,6,0};
Arrays.parallelSort(arr); //使用多线程进行并行排序,效率更高
System.out.println(Arrays.toString(arr));
}
多线程的问题
具体看juc并发编程
// 并发操作集合 导致线程不安全
@Test
public void t4()throws InterruptedException{
List<Integer> list=new ArrayList<>();
new Thread(()->{
for(int i=0;i< 1000;i++){
list.add(i); //两个线程同时操作集合类进行插入操作
}
}).start();
new Thread(()->{
for(int i=1000;i< 2000;i++){
list.add(i);
}
}).start();
Thread.sleep(2000);
System.out.println(list.size());
}