并行流就是把一個內(nèi)容分成多個數(shù)據(jù)塊,并用不同的線程分別處理每個數(shù)據(jù)塊的流。
java 8 中將并行進(jìn)行了優(yōu)化,我們可以很容易的對數(shù)據(jù)進(jìn)行并行操作。Stream API 可以聲明性地通過 parallel()與 sequential()在并行流與順序流之間進(jìn)行切換。
了解 Fork/Join 框架
Fork/Join 框架:就是在必要的情況下,將一個大任務(wù),進(jìn)形拆分(fork)成若干個小任務(wù)(拆到不可再拆時),再將一個個的小任務(wù)運(yùn)行的結(jié)果進(jìn)行join匯總。
Fork/Join 框架與傳統(tǒng)線程池的區(qū)別:
采用“工作竊取”模式(work-stealing):
當(dāng)執(zhí)行新的任務(wù)時,它可以將其拆分成更小的任務(wù)執(zhí)行,并將小任務(wù)加到線程隊(duì)列中,然后再從一個隨機(jī)線程的隊(duì)列中偷一個并把它放在自己的隊(duì)列中。
相對于一般的線程池實(shí)現(xiàn),fork/join框架的優(yōu)勢體現(xiàn)在對其中包含的任務(wù)的處理方式上.在一般的線程池中,如果一個線程正在執(zhí)行的任務(wù)由于某些原因無法繼續(xù)運(yùn)行,那么該線程會處于等待狀態(tài).而在fork/join框架實(shí)現(xiàn)中,如果某個子問題由于等待另外一個子問題的完成而無法繼續(xù)運(yùn)行.那么處理該子問題的線程會主動尋找其他尚未運(yùn)行的子問題來執(zhí)行.這種方式減少了線程的等待時間,提高了性能。
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(); } } }
新聞名稱:java8中forkjoin和optional框架使用-創(chuàng)新互聯(lián)
分享URL:http://aaarwkj.com/article14/ihjge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、網(wǎng)站收錄、手機(jī)網(wǎng)站建設(shè)、微信小程序、網(wǎng)站營銷、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容