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

詳解Java8與Runtime.getRuntime().availableProcessors()

 更新時(shí)間:2020年06月10日 14:45:57   作者:小熊的進(jìn)階之路  
這篇文章主要介紹了詳解Java8與Runtime.getRuntime().availableProcessors(),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

lambda表達(dá)式以及并行流。官方承諾你寫(xiě)出來(lái)的代碼更運(yùn)行得更快。流會(huì)自動(dòng)通過(guò)Fork/Join池并行地執(zhí)行。我聽(tīng)過(guò)一些關(guān)于Java 8的主題的演講,不過(guò)在這個(gè)非常關(guān)鍵的點(diǎn)上它們都說(shuō)的有點(diǎn)問(wèn)題。我計(jì)劃在后續(xù)的文章中對(duì)并行流進(jìn)行下深入的講解,在這之前我先花點(diǎn)時(shí)間仔細(xì)地分析下它。關(guān)于這個(gè)問(wèn)題,我只想問(wèn)你們一個(gè)非常簡(jiǎn)單的問(wèn)題,不過(guò)也是一個(gè)非常重要的問(wèn)題,因?yàn)樗呛芏鄦?wèn)題的關(guān)鍵所在。這個(gè)問(wèn)題是:

這些并行操作的線程都是從哪來(lái)的?

在Java 8里,我們有一個(gè)通用的Fork/Join池,我們可以通過(guò)ForkJoinPool.commonPool()來(lái)訪問(wèn)它。并行流,并行排序,CompletableFuture等都會(huì)用到它。當(dāng)你構(gòu)造一個(gè)Fork/Join池的時(shí)候,通常你都沒(méi)有指定最大線程數(shù)。你只是指定了一個(gè)期望的并發(fā)數(shù),也就是說(shuō)你希望在運(yùn)行時(shí)的同一時(shí)間有多少活躍的線程。當(dāng)線程被阻塞在一個(gè)phaser的時(shí)候,會(huì)創(chuàng)建另一個(gè)線程來(lái)保證池里有足夠的活躍線程。這個(gè)phaser就是觸發(fā)這個(gè)行為的同步器。Fork/Join池最大的線程數(shù)是32767,但在遠(yuǎn)沒(méi)達(dá)到這個(gè)數(shù)量時(shí),在大多數(shù)操作系統(tǒng)上就會(huì)拋出OutOfMemoryError異常了。在這段示例代碼中,我會(huì)不斷創(chuàng)建新的RecursiveAction真到達(dá)到第一個(gè)階段(也就是到達(dá)了200個(gè)線程)。如果我們?cè)黾拥揭粋€(gè)更大的數(shù)字,比如說(shuō)到100000,這段代碼就會(huì)失敗了。

import java.util.concurrent.*;

public class PhaserForkJoin {
 public static void main(String... args) {
  ForkJoinPool common = ForkJoinPool.commonPool();
  Phaser phaser = new Phaser(200);
  common.invoke(new PhaserWaiter(phaser));
 }

 private static class PhaserWaiter extends RecursiveAction {
  private final Phaser phaser;

  private PhaserWaiter(Phaser phaser) {
   this.phaser = phaser;
   System.out.println(ForkJoinPool.commonPool().getPoolSize());
  }

  protected void compute() {
   if (phaser.getPhase() > 0) return; // we've passed first phase
   PhaserWaiter p1 = new PhaserWaiter(phaser);
   p1.fork();
   phaser.arriveAndAwaitAdvance();
   p1.join();
  }
 }
}

Fork/Join池沒(méi)有一個(gè)最大線程數(shù),只有一個(gè)期望并發(fā)數(shù),這是指我們希望同時(shí)有多少個(gè)活躍線程。

通用池是很有用的,因?yàn)樗馕吨煌?lèi)型的作業(yè)可以共享同一個(gè)池,而不用超出代碼所運(yùn)行的機(jī)器上期望并發(fā)數(shù)。當(dāng)然了,如果一個(gè)線程由于非Phaser的其它原因阻塞了,那可能這個(gè)通用池的表現(xiàn)就和預(yù)期的不太一樣了。

什么是通用FJ池的默認(rèn)的期望并發(fā)數(shù)?

通常的FJ池的期望并發(fā)數(shù)的默認(rèn)值是Runtime.getRuntime().availableProcessors() -1。如果你在一個(gè)雙核的機(jī)器上通過(guò)Arrays.parallelSort()來(lái)運(yùn)行并行排序的話,默認(rèn)使用的是普通的Arrays.sort()方法。盡管Oracle的官方文檔可能許諾你可以獲得性能提升,但是你在一個(gè)雙核的機(jī)器上可能完全看不著任何提升。

然而,更大的問(wèn)題在于Runtime.getRuntime().availableProcessors()也并非都能返回你所期望的數(shù)值。比如說(shuō),在我的雙核1-2-1機(jī)器上,它返回的是2,這是對(duì)的。不過(guò)在我的1-4-2機(jī)器 上,也就是一個(gè)CPU插槽,4核,每個(gè)核2個(gè)超線程,這樣的話會(huì)返回8。不過(guò)我其實(shí)只有4個(gè)核,如果代碼的瓶頸是在CPU這塊的話,我會(huì)有7個(gè)線程在同時(shí) 競(jìng)爭(zhēng)CPU周期,而不是更合理的4個(gè)線程。如果我的瓶頸是在內(nèi)存這的話,那這個(gè)測(cè)試我可以獲得7倍的性能提升。

不過(guò)這還沒(méi)完!Java Champions上的一個(gè)哥們發(fā)現(xiàn)了一種情況,他有一臺(tái)16-4-2的機(jī)器 (也就是16個(gè)CPU插槽,每個(gè)CPU4個(gè)核,每核兩個(gè)超線程,返回的值居然是16!從我的i7 Macbook pro上的結(jié)果來(lái)看,我覺(jué)得應(yīng)該返回的是16*4*2=128。在這臺(tái)機(jī)器上運(yùn)行Java 8的話,它只會(huì)將通用的FJ池的并發(fā)數(shù)設(shè)置成15。正如 Brian Goetz所指出的,“虛擬機(jī)其實(shí)不清楚什么是處理器,它只是去請(qǐng)求操作系統(tǒng)返回一個(gè)值。同樣的,操作系統(tǒng)也不知道怎么回事,它是去問(wèn)的硬件設(shè)備。硬件會(huì)告訴它一個(gè)值,通常來(lái)說(shuō)是硬件線程數(shù)。操作系統(tǒng)相信硬件說(shuō)的,而虛擬機(jī)又相信操作系統(tǒng)說(shuō)的?!?/p>

所幸的是還有一個(gè)解決方案。啟動(dòng)的時(shí)候,你可以通過(guò)系統(tǒng)屬性 java.util.concurrent.ForkJoinPool.common.parallelism來(lái)設(shè)置通用池的并發(fā)數(shù)。也就是說(shuō),我們可以通過(guò)-Djava.util.concurrent.ForkJoinPool.common.parallelism=128來(lái)啟動(dòng)這段程序,現(xiàn)在你可以看到它的并發(fā)數(shù)是128了:

import java.util.concurrent.*;

public class ForkJoinPoolCommon {
 public static void main(String... args) {
  System.out.println(ForkJoinPool.commonPool());
 }
}

還有兩個(gè)控制通用池的額外的系統(tǒng)屬性。如果你希望處理未捕獲異常的話,你可以通過(guò)java.util.concurrent.ForkJoinPool.common.exceptionHandler來(lái)指定一個(gè)處理類(lèi)。如果你希望有自己的線程工廠的話,可以通過(guò) java.util.concurrent.ForkJoinPool.common.threadFactory來(lái)配置。默認(rèn)的Fork/Join池的工廠生成的是守護(hù)線程,可能你的應(yīng)用里面不希望使用它。不過(guò)如果你這么做的話請(qǐng)小心——這樣你就無(wú)法關(guān)閉這個(gè)通用池了。

到此這篇關(guān)于詳解Java8與Runtime.getRuntime().availableProcessors()的文章就介紹到這了,更多相關(guān)Java8與Runtime.getRuntime().availableProcessors()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)簡(jiǎn)單的萬(wàn)年歷

    Java實(shí)現(xiàn)簡(jiǎn)單的萬(wàn)年歷

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單的萬(wàn)年歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Spring Boot項(xiàng)目搭建的兩種方式

    Spring Boot項(xiàng)目搭建的兩種方式

    springboot簡(jiǎn)單快捷方便的優(yōu)點(diǎn)深受用戶(hù)喜愛(ài),springboot開(kāi)發(fā)環(huán)境搭建過(guò)程是每個(gè)開(kāi)發(fā)者必須要做的工作,今天小編寫(xiě)的一篇教程關(guān)于Spring Boot項(xiàng)目搭建方法,通過(guò)兩種方式給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • java制作簡(jiǎn)單驗(yàn)證碼功能

    java制作簡(jiǎn)單驗(yàn)證碼功能

    這篇文章主要為大家詳細(xì)介紹了java制作簡(jiǎn)單驗(yàn)證碼功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • spring data jpa 創(chuàng)建方法名進(jìn)行簡(jiǎn)單查詢(xún)方式

    spring data jpa 創(chuàng)建方法名進(jìn)行簡(jiǎn)單查詢(xún)方式

    這篇文章主要介紹了spring data jpa 創(chuàng)建方法名進(jìn)行簡(jiǎn)單查詢(xún)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java結(jié)合prometheus如何實(shí)現(xiàn)自定義數(shù)據(jù)監(jiān)控

    java結(jié)合prometheus如何實(shí)現(xiàn)自定義數(shù)據(jù)監(jiān)控

    文章介紹了如何配置Prometheus監(jiān)控系統(tǒng),包括配置文件prometheus.yml、被監(jiān)控應(yīng)用的指標(biāo)暴露配置以及自定義監(jiān)控指標(biāo)的實(shí)現(xiàn),同時(shí),還詳細(xì)說(shuō)明了監(jiān)控應(yīng)用如何通過(guò)Prometheus API獲取數(shù)據(jù)、處理數(shù)據(jù)并返回結(jié)果
    2024-12-12
  • springboot3.x中Jakarta包無(wú)法引入的問(wèn)題

    springboot3.x中Jakarta包無(wú)法引入的問(wèn)題

    最近想將一些項(xiàng)目升級(jí)到springboot3.x和java17的時(shí)候,發(fā)現(xiàn)項(xiàng)目依賴(lài)中有Jakarta的包,但是代碼標(biāo)紅提示沒(méi)有相關(guān)的類(lèi),本文就來(lái)介紹一下解決方法,感興趣的可以了解一下
    2024-02-02
  • Java線程編程中Thread類(lèi)的基礎(chǔ)學(xué)習(xí)教程

    Java線程編程中Thread類(lèi)的基礎(chǔ)學(xué)習(xí)教程

    這篇文章主要介紹了Java線程編程中Thread類(lèi)的基礎(chǔ)學(xué)習(xí)教程,Thread類(lèi)包含諸多操作線程的方法,非常重要,需要的朋友可以參考下
    2015-12-12
  • Java獲取文件路徑常用方法解析

    Java獲取文件路徑常用方法解析

    這篇文章主要介紹了Java獲取文件路徑常用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java編程中最基礎(chǔ)的文件和目錄操作方法詳解

    Java編程中最基礎(chǔ)的文件和目錄操作方法詳解

    這篇文章主要介紹了Java編程中最基礎(chǔ)的文件和目錄操作方法詳解,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • Java內(nèi)部類(lèi)原理、概述與用法實(shí)例詳解

    Java內(nèi)部類(lèi)原理、概述與用法實(shí)例詳解

    這篇文章主要介紹了Java內(nèi)部類(lèi)原理、概述與用法,結(jié)合實(shí)例形式詳細(xì)分析了Java內(nèi)部類(lèi)的相關(guān)概念、原理、訪問(wèn)、調(diào)用方法等操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-03-03

最新評(píng)論

永城市| 逊克县| 信宜市| 延安市| 新建县| 沛县| 延庆县| 博客| 古蔺县| 九江县| 奈曼旗| 上高县| 乐业县| 突泉县| 武穴市| 唐海县| 黄石市| 喀什市| 永丰县| 宁陕县| 万载县| 蒙自县| 樟树市| 新津县| 东光县| 惠州市| 城市| 民县| 浦县| 博乐市| 思茅市| 柘城县| 麻栗坡县| 嘉祥县| 蒙城县| 山丹县| 介休市| 桦甸市| 闸北区| 柘荣县| 桐乡市|