1. 程式人生 > >JDK 8 新特性 | 對 Fork/Join 的優化

JDK 8 新特性 | 對 Fork/Join 的優化

先來簡單瞭解 Fork/Join 框架

Fork/Join 框架:就是在必要的情況下,將一個大任務,進行拆分(fork)成若干個小任務(拆到不可再拆時),再將一個個的小任務運算的結果進行 join 彙總。

這裡寫圖片描述
Fork/Join 框架與傳統執行緒池的區別

採用“工作竊取”模式(work-stealing):當執行新的任務時它可以將其拆分分成更小的任務執行,並將小任務加到執行緒佇列中,然後再從一個隨機執行緒的佇列中偷一個並把它放在自己的佇列中。

相對於一般的執行緒池實現,fork/join框架的優勢體現在對其中包含的任務的處理方式上。在一般的執行緒池中,如果一個執行緒正在執行的任務由於某些原因無法繼續執行,那麼該執行緒會處於等待狀態。而在fork/join

框架實現中,如果某個子問題由於等待另外一個子問題的完成而無法繼續執行。那麼處理該子問題的執行緒會主動尋找其他尚未執行的子問題來執行。這種方式減少了執行緒的等待時間,提高了效能。

JDK8 對 Fork/Join 的優化

JDK8 對 Fork/Join 的優化:主要是讓 Fork/Join 使用起來更加方便。對 Fork/Join 進行了封裝,簡化使用方式。

對於 JDK8 對 Fork/Join 的底層優化,這裡不進行分析。

示例程式碼

/**
 * 求和
 */
public class ForkJoin {

    /**
     * JDK8 之前的寫法
     */
    @Test
public void test1() { long start = System.currentTimeMillis(); ForkJoinPool pool = new ForkJoinPool(); ForkJoinTask<Long> task = new ForkJoinCalculate(0L, 10000000000L); long sum = pool.invoke(task); System.out.println(sum); long end = System.currentTimeMillis(); System.out.println("耗費的時間為: "
+ (end - start)); // 112-1953-1988-2654-2647-20663-113808 } /** * 普通的寫法 */ @Test public void test2() { long start = System.currentTimeMillis(); long sum = 0L; for (long i = 0L; i <= 10000000000L; i++) { sum += i; } System.out.println(sum); long end = System.currentTimeMillis(); System.out.println("耗費的時間為: " + (end - start)); // 34-3174-3132-4227-4223-31583 } /** * JDK8 的寫法 */ @Test public void test3() { long start = System.currentTimeMillis(); Long sum = LongStream.rangeClosed(0L, 10000000000L).parallel().sum(); System.out.println(sum); long end = System.currentTimeMillis(); System.out.println("耗費的時間為: " + (end - start)); // 2061-2053-2086-18926 } }
public class ForkJoinCalculate extends RecursiveTask<Long> {

    private long start;
    private long end;

    private static final long THRESHOLD = 10000L; // 臨界值

    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();
        }
    }
}

執行結果:

-5340232216128654848
耗費的時間為: 2488


-5340232216128654848
耗費的時間為: 3445


-5340232216128654848
耗費的時間為: 1836

相關推薦

JDK 8 特性 | Fork/Join優化

先來簡單瞭解 Fork/Join 框架 Fork/Join 框架:就是在必要的情況下,將一個大任務,進行拆分(fork)成若干個小任務(拆到不可再拆時),再將一個個的小任務運算的結果進行 join 彙總。 Fork/Join 框架與傳統執行緒

Java/JDK 8 特性1.8對於1.7做了哪些優化/改進

Java 8 新特性 Java 8 (又稱為 jdk 1.8) 是 Java 語言開發的一個主要版本。 Oracle 公司於 2014 年 3 月 18 日釋出 Java 8 ,它支援函數語言程式設計,新的 JavaScript 引擎,新的日期 API,新的Str

(Java)jdk-8 - 特性 - 介面

介面: Java 8允許我們給介面新增一個非抽象的方法實現,只需要使用default關鍵字即可,這個又叫做擴充套件方法 注意:現在介面還可以【存在靜態方法】,可以使用 介面名.靜態方法名 的形式直接呼叫。 例子: public class Test{ public static

JDK 8 特性之函數語言程式設計 → Stream API

開心一刻   今天和朋友們去K歌,看著這群年輕人一個個唱的賊嗨,不禁感慨道:年輕真好啊!   想到自己年輕的時候,那也是拿著麥克風不放的人   現在的我沒那激情了,只喜歡坐在角落裡,默默的聽著他們唱,就連旁邊的妹子都勸我說:大哥別摸了,唱首歌吧 Stream 初體驗   很多時候,我們往往會選擇在資料庫層面

JDK 8 特性,從入門到精通

default關鍵字   在jdk1.8以前接口裡面是隻能有抽象方法,不能有任何方法的實現的。   在jdk1.8裡面打破了這個規定,引入了新的關鍵字:default,使用default修飾方法,可以在接口裡定義具體的方法 建立一個工程 程式碼實現 預設方法   接口裡面定義了一個預設方法,這個介面的實現類

JDK 1.8特性Lambda入門

轉載至:https://blog.csdn.net/chenchaofuck1/article/details/51897481 網上關於java lambda的例子很多,但是這些五花八門的例子很不常見不常用,最後導致初學者望而卻步,其實我們抓住lambda的本質之後,會發現lambda還是

Open JDK 7 特性(即JDK 1.8 特性)

Summary Features are listed in order, more or less, from lowest to highest in the overall JDK  software stack. Features that were onc

JDK 1.8 特性之Stream 詳解個人筆記

雖然java 10已經發布,11 已經在路上,雖然 java EE 已經更名為 jakarta EE,但是大多數人連jdk1.8的新特性都不太瞭解,本人也是如此,所以在學習Java 8 API 新增的 Stream 的時候 做一些個人筆記,希望幫助自己的同時也能幫到大家。

JDK 1.8 特性之Lambda表示式

Lambda表示式基礎 Lambda表示式【Lambda Expressions】也可稱為閉包,是推動 Java 8 釋出的最重要新特性。Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞進方法中),使用 Lambda 表示式可以使程式碼變的更加

jdk 1.8 特性之——stream Collectors

Collectors的倆個作用:           1、將資料流縮減為一個單一值,可以是一個collection、基本資料型別或者一個自定義物件;          2、將資料流中的元素進行分組,根據任務型別將流中所有的任務進行分組。這將產生一個Map<TaskTyp

Java 5/Java 6/Java7/Java 8特性收集

lan 鏈接 develop new strong tar chrom eve ref 前言: Java 8對應的JDK版本為JDK8,而官網下載回來安裝的時候,文件夾上寫的是JDK1.8,同一個意思。(而這個版本命名也是有規律的,以此類推) 一、Java 5 1、h

Java 8 特性1-函數式接口

實例 his sys subject 生成 license object類 acc class類 Java 8 新特性1-函數式接口 (原) Lambda表達式基本結構: (param1,param2,param3) -> {代碼塊} 例1: package

java 1.7 1.8特性

val row def jce arr app 線程安全 動態 adl 在JDK1.7的新特性方面主要有下面幾方面的增強:1.jdk7語法上1.1二進制變量的表示,支持將整數類型用二進制來表示,用0b開頭。1.2 Switch語句支持string類型1.3 Try-with

Java 8 特性:5-Supplier、IntSupplier、BinaryOperator接口

point except java 8 htm import void int() uci cti (原) 這個接口很簡單,裏面只有一個抽象方法,沒有default和靜態方法。 /* * Copyright (c) 2012, 2013, Oracle and/or

JAVA 8 特性 (值得學習)

java 8 新特性JAVA 8 已經出現好長時間了,大的互聯網公司很多都已經使用了,甚至很多知名互聯網公司踩過很多坑,也有一些大牛分享出了他們的實戰經驗。去很多知名的互聯網公司經常會被面試官問,你了解java 8嗎?你知道它的一些新特性嗎?好像似乎成了一面面試官必問的一道題目。這篇博文,只是簡答的介紹了一下

JDK 9特性匯總

one 已久 集合 哪些 com 描述 匯總 框架 可變 寫在前面: ?期待已久的JDK 9發布了,有哪些新特性值得我們去體驗呢?小編給你整理了JDK 9的新特性。 JDK9的關鍵更改: Java平臺模塊化系統:引入了一種新的Java編程組件模塊,

Java 8 特性:4-Optional類

get方法 syn 序列 new ret 有一個 例子 使用 n) (原) 先看看上面的說明: /** * A container object which may or may not contain a non-null value. * If a value

Java--8--特性--Lambda

value 需要 員工信息 span final oid function get test java9 都出來了,我才開始接觸到java8的新特性,有點脫節啊。。 Lambda是一個匿名函數,可以理解為一段可以傳遞的代碼,將代碼像數據一樣傳遞,下面是一個小例子。 pub

Java 8特性之接口改善(八惡人-1)

1.8 我想 when 直接 有一個 圖片 class java類 聖誕節 Daisy Donergue 多莫歌·黛西 “By woman, you mean her?” 她也能叫女人?   Java 8在13年9月發布,寫這篇博文的時間已經是17年12月份了。

Java 8特性之 並行和並行數組(八惡人-8

都是 class chm 請求 external syntax 匹配 main jvm Jody Domingre 多莫歌·喬迪 “How you doing, dummy?” 你還好嗎,傻瓜 一、基本介紹   Java8不僅增加了Stream,而且還增加了para