最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的Fork/Join框架使用詳解

 更新時間:2024年01月22日 10:45:34   作者:帥氣的喵喵  
這篇文章主要介紹了Java中的Fork/Join框架使用詳解,Fork/Join?框架:就是在必要的情況下,將一個大任務,進行<BR>拆分(fork)成若干個小任務(拆到不可再拆時),再將一個個<BR>的小任務運算的結果進行?join?匯總,需要的朋友可以參考下

意義

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

Fork/Join 框架與傳統(tǒng)線程池的區(qū)別

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

相對于一般的線 程池實現(xiàn),fork/join框架的優(yōu)勢體現(xiàn)在對其中包含的任務的 處理方式上.在一般的線程池中,如果一個線程正在執(zhí)行的 任務由于某些原因無法繼續(xù)運行,那么該線程會處于等待 狀態(tài)、

而在fork/join框架實現(xiàn)中,如果某個子問題由于等 待另外一個子問題的完成而無法繼續(xù)運行.那么處理該子 問題的線程會主動尋找其他尚未運行的子問題來執(zhí)行.這 種方式減少了線程的等待時間,提高了性能.  

使用

ForkJoinTask:我們要使用 Fork/Join 框架,首先需要創(chuàng)建一個 ForkJoin 任務。

該類提供了在任務中執(zhí)行 fork 和 join 的機制。通常情況下我們不需要直接集成 ForkJoinTask 類,只需要繼承它的子類,

  • RecursiveAction:用于沒有返回結果的任務
  • RecursiveTask:用于有返回結果的任務
  • ForkJoinPool:ForkJoinTask 需要通過 ForkJoinPool 來執(zhí)行
  • RecursiveTask: 繼承后可以實現(xiàn)遞歸(自己調(diào)自己)調(diào)用的任務
class MyTask extends RecursiveTask<Integer> {
    //拆分差值不能超過10,計算10以內(nèi)運算
    private static final Integer VALUE = 10;
    private int begin ;//拆分開始值
    private int end;//拆分結束值
    private int result ; //返回結果
    //創(chuàng)建有參數(shù)構造
    public MyTask(int begin,int end) {
        this.begin = begin;
        this.end = end;
    }
    //拆分和合并過程
    @Override
    protected Integer compute() {
        //判斷相加兩個數(shù)值是否大于10
        if((end-begin)<=VALUE) {
            //相加操作
            for (int i = begin; i <=end; i++) {
                result = result+i;
            }
        } else {//進一步拆分
            //獲取中間值
            int middle = begin+(end- begin)/2;
            //拆分左邊
            MyTask task01 = new MyTask(begin,middle);
            //拆分右邊
            MyTask task02 = new MyTask(middle+1,end);
            //調(diào)用方法拆分
            task01.fork();
            task02.fork();
            //合并結果
            result = task01.join()+task02.join();
        }
        return result;
    }
}
public class ForkJoinDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //創(chuàng)建MyTask對象
        MyTask myTask = new MyTask(0,100);
        //創(chuàng)建分支合并池對象
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
        //獲取最終合并之后結果
        Integer result = forkJoinTask.get();
        System.out.println(result);
        //關閉池對象
        forkJoinPool.shutdown();
    }
}
package com.yxj.java8;
import java.util.concurrent.RecursiveTask;
public class ForkJoinCalculate extends RecursiveTask<Long>{
	/**
	 * 
	 */
	private static final long serialVersionUID = 13475679780L;
	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();
		}
	}
}
package com.yxj.java8;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.stream.LongStream;
import org.junit.Test;
public class TestForkJoin {
	@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
	}
	@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
	}
}

到此這篇關于Java中的Fork/Join框架使用詳解的文章就介紹到這了,更多相關Fork/Join框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java字符串拼接的優(yōu)雅方式實例詳解

    Java字符串拼接的優(yōu)雅方式實例詳解

    字符串拼接一般使用“+”,但是“+”不能滿足大批量數(shù)據(jù)的處理,下面這篇文章主要給大家介紹了關于Java字符串拼接的幾種優(yōu)雅方式,需要的朋友可以參考下
    2021-07-07
  • 詳解Java的MyBatis框架和Spring框架的整合運用

    詳解Java的MyBatis框架和Spring框架的整合運用

    在Web端的SSH框架整合中Spring主要負責數(shù)據(jù)庫處理,而引入MyBatis后二者的集成使用效果更佳,下面我們就來詳解Java的MyBatis框架和Spring框架的整合運用
    2016-06-06
  • Java Swing實現(xiàn)掃雷小游戲

    Java Swing實現(xiàn)掃雷小游戲

    這篇文章主要為大家詳細介紹了Java Swing實現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Java Objects工具類原理及用法詳解

    Java Objects工具類原理及用法詳解

    這篇文章主要介紹了Java Objects工具類原理及用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • Java計算數(shù)學表達式代碼詳解

    Java計算數(shù)學表達式代碼詳解

    這篇文章主要介紹了Java計算數(shù)學表達式代碼詳解,具有一定借鑒價值,需要的朋友可以了解下。
    2017-12-12
  • idea配置maven環(huán)境時maven下載速度慢的解決方法

    idea配置maven環(huán)境時maven下載速度慢的解決方法

    我們在idea配置maven環(huán)境的時候會發(fā)現(xiàn)maven更新慢的現(xiàn)象,解決辦法就是下載國內(nèi)的鏡像包,完美解決下載速度慢的問題,文中有詳細的具體操作方法,并通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Resty極簡restful框架快速接入Spring

    Resty極簡restful框架快速接入Spring

    這篇文章主要為大家介紹了Resty極簡的restful框架快速接入Spring詳細說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • java實現(xiàn)員工工資管理系統(tǒng)

    java實現(xiàn)員工工資管理系統(tǒng)

    這篇文章主要為大家詳細介紹了java實現(xiàn)員工工資管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java實現(xiàn)word文檔轉pdf并添加水印的方法詳解

    java實現(xiàn)word文檔轉pdf并添加水印的方法詳解

    這篇文章主要介紹了java實現(xiàn)word文檔轉pdf并添加水印的方法,結合實例形式詳細分析了java word文檔轉PDF相關實現(xiàn)技巧與操作注意事項,需要的朋友可以參考下
    2019-09-09
  • ArrayList詳解和使用示例_動力節(jié)點Java學院整理

    ArrayList詳解和使用示例_動力節(jié)點Java學院整理

    ArrayList 是一個數(shù)組隊列,相當于 動態(tài)數(shù)組。與Java中的數(shù)組相比,它的容量能動態(tài)增長。接下來通過本文給大家介紹arraylist詳解和使用示例代碼,需要的的朋友一起學習吧
    2017-05-05

最新評論

龙海市| 安溪县| 略阳县| 乾安县| 南郑县| 台东县| 宁阳县| 赫章县| 吴忠市| 兴海县| 嘉兴市| 泸溪县| 昌都县| 彰武县| 四会市| 蒲江县| 监利县| 繁峙县| 遵义市| 长寿区| 石门县| 揭西县| 教育| 盐山县| 正镶白旗| 屏山县| 云阳县| 长海县| 双桥区| 津南区| 华坪县| 吴川市| 莆田市| 页游| 抚州市| 呼玛县| 同心县| 抚顺市| 阳新县| 阿克苏市| 易门县|