欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

意義

Fork/Join 框架:就是在必要的情況下,將一個(gè)大任務(wù),進(jìn)行 拆分(fork)成若干個(gè)小任務(wù)(拆到不可再拆時(shí)),再將一個(gè)個(gè) 的小任務(wù)運(yùn)算的結(jié)果進(jìn)行 join 匯總  

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

采用 “工作竊取”模式(work-stealing): 當(dāng)執(zhí)行新的任務(wù)時(shí)它可以將其拆分分成更小的任務(wù)執(zhí)行, 并將小任務(wù)加到線程隊(duì)列中,然后再?gòu)囊粋€(gè)隨機(jī)線程的隊(duì) 列中偷一個(gè)并把它放在自己的隊(duì)列中。

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

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

使用

ForkJoinTask:我們要使用 Fork/Join 框架,首先需要?jiǎng)?chuàng)建一個(gè) ForkJoin 任務(wù)。

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

  • RecursiveAction:用于沒有返回結(jié)果的任務(wù)
  • RecursiveTask:用于有返回結(jié)果的任務(wù)
  • ForkJoinPool:ForkJoinTask 需要通過 ForkJoinPool 來執(zhí)行
  • RecursiveTask: 繼承后可以實(shí)現(xiàn)遞歸(自己調(diào)自己)調(diào)用的任務(wù)
class MyTask extends RecursiveTask<Integer> {
    //拆分差值不能超過10,計(jì)算10以內(nèi)運(yùn)算
    private static final Integer VALUE = 10;
    private int begin ;//拆分開始值
    private int end;//拆分結(jié)束值
    private int result ; //返回結(jié)果
    //創(chuàng)建有參數(shù)構(gòu)造
    public MyTask(int begin,int end) {
        this.begin = begin;
        this.end = end;
    }
    //拆分和合并過程
    @Override
    protected Integer compute() {
        //判斷相加兩個(gè)數(shù)值是否大于10
        if((end-begin)<=VALUE) {
            //相加操作
            for (int i = begin; i <=end; i++) {
                result = result+i;
            }
        } else {//進(jìn)一步拆分
            //獲取中間值
            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();
            //合并結(jié)果
            result = task01.join()+task02.join();
        }
        return result;
    }
}
public class ForkJoinDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //創(chuàng)建MyTask對(duì)象
        MyTask myTask = new MyTask(0,100);
        //創(chuàng)建分支合并池對(duì)象
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
        //獲取最終合并之后結(jié)果
        Integer result = forkJoinTask.get();
        System.out.println(result);
        //關(guān)閉池對(duì)象
        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(); //拆分,并將該子任務(wù)壓入線程隊(duì)列
			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("耗費(fèi)的時(shí)間為: " + (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("耗費(fèi)的時(shí)間為: " + (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("耗費(fèi)的時(shí)間為: " + (end - start)); //2061-2053-2086-18926
	}
}

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

相關(guān)文章

  • win10和win7下java開發(fā)環(huán)境配置教程

    win10和win7下java開發(fā)環(huán)境配置教程

    這篇文章主要為大家詳細(xì)介紹了win7下Java開發(fā)環(huán)境配置教程,win10下Java開發(fā)環(huán)境配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • JavaWeb驗(yàn)證碼校驗(yàn)功能代碼實(shí)例

    JavaWeb驗(yàn)證碼校驗(yàn)功能代碼實(shí)例

    這篇文章主要介紹了JavaWeb驗(yàn)證碼校驗(yàn)功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java 通過JDBC連接Mysql數(shù)據(jù)庫(kù)

    Java 通過JDBC連接Mysql數(shù)據(jù)庫(kù)

    本文給大家詳細(xì)介紹了java如何使用JDBC連接Mysql的方法以及驅(qū)動(dòng)包的安裝,最后給大家附上了java通過JDBC連接其他各種數(shù)據(jù)庫(kù)的方法,有需要的小伙伴可以參考下。
    2015-11-11
  • java使用rmi傳輸大文件示例分享

    java使用rmi傳輸大文件示例分享

    由于在rmi中無法傳輸文件流,可以先用FileInputStream將文件讀到一個(gè)Byte數(shù)組中,然后把這個(gè)Byte數(shù)組作為參數(shù)傳進(jìn)RMI的方法中,然后在服務(wù)器端將Byte數(shù)組還原為outputStream,這樣就能通過RMI 來傳輸文件了,下面我們來看實(shí)例
    2014-01-01
  • Java實(shí)現(xiàn)Redis分布式鎖的三種方案匯總

    Java實(shí)現(xiàn)Redis分布式鎖的三種方案匯總

    setnx、Redisson、RedLock?都可以實(shí)現(xiàn)分布式鎖,從易到難得排序?yàn)椋簊etnx?<?Redisson?<?RedLock,本文為大家整理了三種方法的實(shí)現(xiàn),希望對(duì)大家有所幫助
    2023-11-11
  • Java設(shè)計(jì)模式之命令模式CommandPattern詳解

    Java設(shè)計(jì)模式之命令模式CommandPattern詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之命令模式CommandPattern詳解,命令模式是把一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤銷的操作,需要的朋友可以參考下
    2023-10-10
  • Java多線程Semaphore工具的使用詳解

    Java多線程Semaphore工具的使用詳解

    Semaphore 是一種用于控制線程并發(fā)訪問數(shù)的同步工具。它通過維護(hù)一定數(shù)量的許可證來限制對(duì)共享資源的訪問,許可證的數(shù)量就是可以同時(shí)訪問共享資源的線程數(shù)目,需要的朋友可以參考下
    2023-05-05
  • Java中final,finally,finalize?有什么區(qū)別

    Java中final,finally,finalize?有什么區(qū)別

    這篇文章主要給大家分享的是?Java中final,finally,finalize?到底有什么區(qū)別,文章圍繞final,finally,finalize的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考的價(jià)值,需要的朋友可以參考一下
    2021-11-11
  • 淺談Java中的四種引用方式的區(qū)別

    淺談Java中的四種引用方式的區(qū)別

    下面小編就為大家?guī)硪黄獪\談Java中的四種引用方式的區(qū)別。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-09-09
  • Spring @Cacheable自定義緩存過期時(shí)間的實(shí)現(xiàn)示例

    Spring @Cacheable自定義緩存過期時(shí)間的實(shí)現(xiàn)示例

    本文主要介紹了Spring @Cacheable自定義緩存過期時(shí)間的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05

最新評(píng)論