<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          面試官:如何合理的配置線程數(shù)?越多越好嗎?

          共 2374字,需瀏覽 5分鐘

           ·

          2022-01-22 21:11



          1

          線程池如何配置合理線程數(shù)


          (1)CPU密集型:


          定義:CPU密集型的意思就是該任務需要大量運算,而沒有阻塞,CPU一直全速運行。


          CPU密集型任務只有在真正的多核CPU上才可能得到加速(通過多線程)。


          CPU密集型任務配置盡可能少的線程數(shù)。


          CPU密集型線程數(shù)配置公式:(CPU核數(shù)+1)個線程的線程池


          (2)IO密集型:


          定義:IO密集型,即該任務需要大量的IO,即大量的阻塞。


          在單線程上運行IO密集型任務會導致浪費大量的CPU運算能力浪費在等待。


          所以IO密集型任務中使用多線程可以大大的加速程序運行,即使在單核CPU上,這種加速主要利用了被浪費掉的阻塞時間。


          • 第一種配置方式:


          由于IO密集型任務線程并不是一直在執(zhí)行任務,則應配置盡可能多的線程。


          配置公式:CPU核數(shù) * 2。


          • 第二種配置方式:


          IO密集型時,大部分線程都阻塞,故需要多配置線程數(shù)。


          配置公式:CPU核數(shù) / (1 – 阻塞系數(shù))(0.8~0.9之間)


          比如:8核 / (1 – 0.9) = 80個線程數(shù)



          2

          自定義線程池


          /**
          ?* 自定義線程池
          ?*/

          public?class?ThreadPoolDemoFour?{
          ????public?static?void?main(String[] args) {
          ????????// 自定義線程池
          ????????ExecutorService threadPool = new?ThreadPoolExecutor(3,
          ????????????????5,
          ????????????????60,
          ????????????????TimeUnit.SECONDS,
          ????????????????new?LinkedBlockingQueue<>(1),
          ????????????????Executors.defaultThreadFactory(),
          ????????????????new?ThreadPoolExecutor.AbortPolicy());
          ?
          ????????try?{
          ????????????for?(int?i = 0; i < 10; i++) {
          ????????????????threadPool.execute(() -> {
          ????????????????????System.out.println(Thread.currentThread().getName() + "\t 辦理業(yè)務");
          ????????????????});
          ????????????}
          ????????} catch?(Exception e) {
          ????????????e.printStackTrace();
          ????????} finally?{
          ????????????threadPool.shutdown();
          ????????}
          ????}
          }



          3

          實際使用JDK內(nèi)置的哪個線程池?


          【強制】線程資源必須通過線程池提供,不允許在應用中自行顯式創(chuàng)建線程。說明:使用線程池的好處是減少在創(chuàng)建和銷毀線程上所消耗的時間以及系統(tǒng)資源的開銷,解決資源不足的問題。如果不使用線程池,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導致消耗完內(nèi)存或者“過度切換”的問題。


          【強制】線程池不允許使用Executors去創(chuàng)建,而是通過ThreadPoolExecutor的方式,這樣的處理方式讓寫的同學更加明確線程池的運行規(guī)則,規(guī)避資源耗盡的風險。說明:Executors返回的線程池對象的弊端如下:


          • FixedThreadPool和SingleThreadPool: 允許的請求隊列長度為Integer.MAX_VALUE,可能會堆積大量的請求,從而導致OOM。

          • CachedThreadPool和ScheduledThreadPool: 允許的創(chuàng)建線程數(shù)量為Integer.MAX_VALUE,可能會創(chuàng)建大量的線程,從而導致OOM。



          來源:lixinkuan.blog.csdn.net/article/details/94501073



          往期推薦



          MySQL 數(shù)據(jù)查詢太多會導致OOM嗎?

          JDK8 到 JDK17 各個版本的重要特性一覽

          從 Java 12 到 Java 17 那些激動人心的新特性

          使用MySQL的JSON數(shù)據(jù)類型,事半功倍!

          不要再封裝各種 Util 工具類了,這款開源項目,真的很好用!

          Eclipse 跌落“神壇”,這款 IDE 后來居上!



          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  边打电话边操逼 | 久久亚洲国产成人精品性色 | 波多野结av衣东京热无码专区 | 国产日产久久高清欧美一区 | 日韩三级欧美激情 |