forkjoin和optional的使用


声明:本文转载自https://my.oschina.net/u/3746673/blog/1594197,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

并行流与串行流

并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。

java 8 中将并行进行了优化,我们可以很容易的对数据进行并行操作。Stream API 可以声明性地通过 parallel()与 sequential()在并行流与顺序流之间进行切换。

了解 Fork/Join 框架

Fork/Join 框架:就是在必要的情况下,将一个大任务,进形拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运行的结果进行join汇总。

 

Fork/Join 框架与传统线程池的区别:

采用“工作窃取”模式(work-stealing):

当执行新的任务时,它可以将其拆分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。

相对于一般的线程池实现,fork/join框架的优势体现在对其中包含的任务的处理方式上.在一般的线程池中,如果一个线程正在执行的任务由于某些原因无法继续运行,那么该线程会处于等待状态.而在fork/join框架实现中,如果某个子问题由于等待另外一个子问题的完成而无法继续运行.那么处理该子问题的线程会主动寻找其他尚未运行的子问题来执行.这种方式减少了线程的等待时间,提高了性能。

import java.time.Duration; import java.time.Instant; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; import java.util.stream.LongStream;  public class TestForkJoin {      public static void main(String[] xx){              }     private static void test1(){     	Instant start=Instant.now();         ForkJoinPool pool=new ForkJoinPool();         ForkJoinTask<Long> task = new ForkJoinCalculate(0L, 10000000000L);         long sum = pool.invoke(task);         System.out.println(sum);          Instant end=Instant.now();         System.out.println("消耗时间"+Duration.between(start, end).toMillis()+"ms");//消耗时间3409ms     }     private static void test2(){         Instant start=Instant.now();          Long sum = LongStream.rangeClosed(0L, 10000L)                              .parallel()                              .reduce(0,Long::sum);         System.out.println(sum);          Instant end=Instant.now();         System.out.println("消耗时间" + Duration.between(start, end).toMillis()+"ms");//消耗时间2418ms     }   }  class ForkJoinCalculate extends RecursiveTask<Long>{      private static final long serialVersionUID = 1234567890L;//序列号      private long start;     private long end;     private static final long THRESHOLD=2500000000L;//临界值      public ForkJoinCalculate(long start,long end) {         this.start=start;         this.end=end;     }      @Override     protected Long compute() {         long length = end - start;         if(length <= THRESHOLD){             long sum=0;             for(long i = start; i <= end; i++){                 sum += i;             }             return sum;         }else{             long middle = (start+end)/2;             ForkJoinCalculate left = new ForkJoinCalculate(start, middle);             left.fork();              ForkJoinCalculate right=new ForkJoinCalculate(middle+1, end);             right.fork();              return left.join() + right.join();         }     }  }

 

 Optional类

 

Optional< T>类(java.util.Optional) 是一个容器类,代表一个值存在或不存在。

原来用null表示一个值不存在,现在 Optional可以更好的表达这个概念。并且可以避免空指针异常。

常用方法:

Optional.of(T t) : 创建一个 Optional 实例

Optional.empty() : 创建一个空的 Optional 实例

Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例

isPresent() : 判断是否包含值

orElse(T t) : 如果调用对象包含值,返回该值,否则返回t

orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值

map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()

flatMap(Function mapper):与 map 类似,要求返回值必须是Optional

public class OptionalTest1 {     public static void main(String[] args){     	     	String s = new String("Ha"); //    	Optional<String> op = Optional.of(null); //    	 //    	String s1 = op.get(); //    	System.out.println(s1);     	 //    	Optional<String> op1 = Optional.empty(); //    	String s1 = op1.get(); //    	System.out.println(s1);        	     	Optional<String> op1 = Optional.ofNullable(null); //    	System.out.println(op1.isPresent()); //    	System.out.println(op1.orElse(new String("Google")));     	//System.out.println(op1.orElseGet(() -> new String("Ali")));     	     	Optional<String> op2 = op1.map((x) -> x.toLowerCase());     	String s2 = op2.get();     	System.out.println(s2);    	     } }

 

   @Test     public void test5(){         Man man=new Man();         String name=getGodnessName(man);         System.out.println(name);     }     //需求:获取一个男人心中女神的名字     public String getGodnessName(Man man){         if(man!=null){             Godness g=man.getGod();             if(g!=null){                 return g.getName();             }         }         return "苍老师";     }      //运用Optional的实体类     @Test     public void test6(){         Optional<Godness> godness=Optional.ofNullable(new Godness("林志玲"));         Optional<NewMan> op=Optional.ofNullable(new NewMan(godness));         String name=getGodnessName2(op);         System.out.println(name);     }      public String getGodnessName2(Optional<NewMan> man){         return man.orElse(new NewMan())                   .getGodness()                   .orElse(new Godness("苍老师"))                   .getName();     }      //注意:Optional 不能被序列化 public class NewMan {      private Optional<Godness> godness = Optional.empty();      private Godness god;      public Optional<Godness> getGod(){         return Optional.of(god);     }      public NewMan() {     }      public NewMan(Optional<Godness> godness) {         this.godness = godness;     }      public Optional<Godness> getGodness() {         return godness;     }      public void setGodness(Optional<Godness> godness) {         this.godness = godness;     }      @Override     public String toString() {         return "NewMan [godness=" + godness + "]";     }  } 

 

 

 

 

本文发表于2017年12月24日 14:32
(c)注:本文转载自https://my.oschina.net/u/3746673/blog/1594197,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1755 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1