flash网站首页,南京做网站优化的企业,wordpress 币,五金机械设备网站模板建设1 四大函数式接口函数式接口#xff1a;只有一个抽象方法的接口#xff0c;只要是函数式接口#xff0c;就可以用lambda表达式简化例如Runnable#xff1a;FunctionalInterface
public interface Runnable {public abstract void run();
}框架底层大量应用函数式接口#…1 四大函数式接口函数式接口只有一个抽象方法的接口只要是函数式接口就可以用lambda表达式简化例如RunnableFunctionalInterface
public interface Runnable {public abstract void run();
}框架底层大量应用函数式接口用来简化编程模型。1.1 FunctionFunction函数式接口该接口用到两个参数一个是输入参数一个是输出参数FunctionalInterface
public interface FunctionT, R {R apply(T t);
...
} demopublic class demo1 {public static void main(String[] args) {//匿名内部类Function function new FunctionString,String(){Overridepublic String apply(String s) {return s;}};// //lambda表达式FunctionString,String function (str) -{return str;};System.out.println(function.apply(AAA));}
}1.2 PredicatePredicate断定型接口有一个输入参数返回值只能是布尔值FunctionalInterface
public interface PredicateT {boolean test(T t);
...
} demopublic class demo2 {public static void main(String[] args) {//判断字符串是否为空PredicateString predicate new PredicateString() {Overridepublic boolean test(String str) {return str.isEmpty();}};PredicateString predicate (str)-{return str.isEmpty();};System.out.println(predicate.test());}
}1.3 PredicatePredicate消费型接口只有输入没有返回值FunctionalInterface
public interface ConsumerT {void accept(T t);
...
} demopublic class demo3 {public static void main(String[] args) {//匿名内部类ConsumerString consumer new ConsumerString(){Overridepublic void accept(String str) {System.out.println(str);}};//lambda表达式ConsumerString consumer (str)-{System.out.println(str);};consumer.accept(AAA);}
}1.4 PredicatePredicate供给型接口没有参数但有返回值FunctionalInterface
public interface SupplierT {T get();
} demopublic class demo4 {public static void main(String[] args) {SupplierString supplier new SupplierString() {Overridepublic String get() {return 1024;}};SupplierString supplier ()-{return 1024;};supplier.get();}
}2 ForkJoin 要点ForkJoin是JDK1.7之后推出用来并行执行任务用于提高效率适用大数据量的场景。ForkJoin将复杂的计算当做一个任务将其分解为多个计算并当做一个个子任务来并行执行工作窃取ForkJoin将某个大任务分解为若干互不依赖的子任务这些子任务分别放到不同的队列里每个队列创建一个单独的线程来执行队列里的任务线程和队列一一对应那么会出现这么一种情况某些线程执行较快其他线程则还在干活因此工作窃取机制就来了--干完活的线程会从其他线程的队列里窃取一个任务来执行同时双端队列允许两个线程同时访问一个线程。 使用forkjoinforkjoinPool通过它来执行计算任务forkjoinPool.execute(ForkJoinTask task)计算类继承RecursiveTaskRecursiveTask继承至ForkJoinTask//计算类
public class ForkJoinDemo extends RecursiveTaskLong {private long start;private long end;//临界值private long temp 10000L;public ForkJoinDemo(long start,long end){this.start start;this.end end;}Overrideprotected Long compute() {if ((end-start)temp){long sum 0L;for (long i start;i end;i){sum i;}return sum;}else {//forkjoinlong middle (startend)/2;//中间值ForkJoinDemo task1 new ForkJoinDemo(start,middle);task1.fork();//拆分任务把任务压入线程队列ForkJoinDemo task2 new ForkJoinDemo(middle1,end);task2.fork();//拆分任务把任务压入线程队列return task1.join()task2.join();}}
} 求和三种方式因为前两种方式我用的long数据类型所以计算会快一些。public class ForkJoinTest {public static void main(String[] args) throws ExecutionException, InterruptedException {common(); //263forkJoin(); //140stream();//232}//1、普通程序员public static void common(){long sum 0;long start System.currentTimeMillis();for (long i 1L; i 10_0000_0000; i) {sum i;}long end System.currentTimeMillis();System.out.println(sum sum 时间(end - start));}//2、使用ForkJoinpublic static void forkJoin() throws ExecutionException, InterruptedException {long start System.currentTimeMillis();ForkJoinPool forkJoinPool new ForkJoinPool();ForkJoinTaskLong task new ForkJoinDemo(1L,10_0000_0000L);ForkJoinTaskLong submit forkJoinPool.submit(task);long sum submit.get();long end System.currentTimeMillis();System.out.println(sum sum 时间(end - start));}//3、stream并行流public static void stream() throws ExecutionException, InterruptedException {long start System.currentTimeMillis();//reduce:将流中元素反复结合起来得到一个值,下边也可简化为.reduce(Long::sum)--调用Long类中的sum方法OptionalLong sum1 LongStream.rangeClosed(1L,10_0000_0000L).parallel().reduce((a, b)-ab);long end System.currentTimeMillis();System.out.println(sum sum1.getAsLong() 时间(end - start));}
}