成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官因為線程池,讓我出門左拐!

網絡
前幾天阿粉的朋友面試,在面試的時候,面試官問到了框架,項目,JVM還有一些關于線程池的內容,而這個線程池,讓阿粉的朋友分分鐘被面試官吊打,只能出門左拐,地鐵站回家了。為什么呢?因為線程池他是真的沒有下功夫去準備,只能涼涼了。

前幾天阿粉的朋友面試,在面試的時候,面試官問到了框架,項目,JVM還有一些關于線程池的內容,而這個線程池,讓阿粉的朋友分分鐘被面試官吊打,只能出門左拐,地鐵站回家了。為什么呢?因為線程池他是真的沒有下功夫去準備,只能涼涼了。

[[327119]]

前序說實話,阿粉在面試的時候,最開始的時候的面試,面試官只是會問實現多線程的方式都有哪些,但是你說到關于線程池的內容的時候,都是一句帶過,而有些面試官對這個也不是很細抓,但是自從阿里的面試官開始問關于線程池的問題之后,這個問題就成了高頻熱點了。

那么接下來,阿粉就繼續帶給大家關于這個線程池,如何分分鐘擺平面試官。

1.什么是線程池

java.util.concurrent.Executors 這個類大家不知道有沒有仔細的去看過這個,而這個類中給我提供了很多方法來創建線程池。

在代碼的開頭的注釋上就寫明了,它可以創建重復使用固定數量線程的線程池,如果在所有線程都處于活動狀態時提交了其他任務,那么他們將在隊列中等待線程可用。

  1. public static ExecutorService newFixedThreadPool(int nThreads) { 
  2.         return new ThreadPoolExecutor(nThreads, nThreads, 
  3.                                       0L, TimeUnit.MILLISECONDS, 
  4.                                       new LinkedBlockingQueue<Runnable>()); 
  5.     } 

而我們創建線程池就是為了解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力。

而面試的時候,我們肯定不能這么說,面試的時候我們可以這么說:

做Java的,當然知道線程池,我們在做開發的時候有時候需要做的任務慢慢的增多,復雜性也會變得越來越強,所以線程的個數就會一點點的往上增加,而對應的線程占用的資源也就越來越多,多個線程占用資源的釋放與注銷需要維護,這時候多個線程的管理就顯得有尤為重要。針對這一情況,sun公司提供了線程池,對線程集合的管理工具。所以線程池就出現了,接下來面試官的問題就是比較狠了,你平常是怎么使用的,幾種常見的都有哪些,畢竟面試官的套路一環套一環。

2.常見的線程池都有哪些,使用的場景是哪里呢?

這時候這個java.util.concurrent.Executors 類大家就排上用場了,比如:

(1) newSingleThreadExecutor

  1. 單個線程的線程池,即線程池中每次只有一個線程工作,單線程串行執行任務 
  2. public ThreadPoolExecutor(int corePoolSize, 
  3.                               int maximumPoolSize, 
  4.                               long keepAliveTime, 
  5.                               TimeUnit unit, 
  6.                               BlockingQueue<Runnable> workQueue, 
  7.                               ThreadFactory threadFactory) { 
  8.         this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 
  9.              threadFactory, defaultHandler); 
  10.     } 

(2)newFixedThreadPool

下面的兩個方法是這個方法的重載,而它的意思很明確,建立一個線程數量固定的線程池,規定的最大線程數量,超過這個數量之后進來的任務,會放到等待隊列中,如果有空閑線程,則在等待隊列中獲取,遵循先進先出原則。

  1. public static ExecutorService newFixedThreadPool(int nThreads) { 
  2.         return new ThreadPoolExecutor(nThreads, nThreads, 
  3.                                       0L, TimeUnit.MILLISECONDS, 
  4.                                       new LinkedBlockingQueue<Runnable>()); 
  5.     } 
  6.  
  7.   public static ExecutorService newFixedThreadPool(int nThreads) { 
  8.         return new ThreadPoolExecutor(nThreads, nThreads, 
  9.                                       0L, TimeUnit.MILLISECONDS, 
  10.                                       new LinkedBlockingQueue<Runnable>()); 
  11.     } 

(3)newCacheThreadExecutor

緩存型線程池,這個線程池的意思是在核心線程達到最大值之前,如果繼續有任務進來就會創建新的核心線程,并加入核心線程池,即使有空閑的線程,也不會復用。

而達到最大核心線程數后,新任務進來,如果有空閑線程,則直接拿來使用,如果沒有空閑線程,則新建臨時線程.

而緩存型的線程池使用的是SynchronousQueue作為等待隊列,他不保存任何的任務,新的任務加入進來之后,他會創建臨時線程來進行使用

  1. public static ExecutorService newCachedThreadPool() { 
  2.         return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 
  3.                                       60L, TimeUnit.SECONDS, 
  4.                                       new SynchronousQueue<Runnable>()); 
  5.     } 

(4)newScheduledThreadPool

計劃型線程池,在它的注釋中給出的很明確的解釋,創建一個線程池,該線程池可以計劃在給定的延遲,或周期性地執行。

也就是說,在新任務到達的時候,我們看到底有沒有空閑線程,如果有,直接拿來使用,如果沒有,則新建線程加入池。而這里面使用的就是DelayedWorkQueue作為等待隊列,中間進行了一定的等待,等待時間過后,繼續執行任務。

  1. public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { 
  2.             return new ScheduledThreadPoolExecutor(corePoolSize); 
  3.     } 
  4.      
  5.     public static ScheduledExecutorService newScheduledThreadPool( 
  6.                 int corePoolSize, ThreadFactory threadFactory) { 
  7.             return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory); 
  8.      } 

3.你看過阿里巴巴開發手冊么?里面對線程是怎么說的?說實話,阿粉是一開始真的沒怎么注意過這個在阿里巴巴開發手冊上關于線程的使用,是怎么做的,而面試官很明顯,問出這個問題的時候,肯定是看過了,之后阿粉看了阿里巴巴開發手冊,不得不感慨,阿里巴巴,真的是..

我們在日常使用都是會出現這段代碼:

  1. ExecutorService cachedThreadPool=Executors.newFixedThreadPool(); 

但是阿里巴巴說,不好意思呀,強制線程池不允許使用 Executors 去創建

那你說嘛,我該怎么辦,而推薦的卻是 ThreadPoolExecutor

  1. public ThreadPoolExecutor(int corePoolSize, 
  2.                               int maximumPoolSize, 
  3.                               long keepAliveTime, 
  4.                               TimeUnit unit, 
  5.                               BlockingQueue<Runnable> workQueue) { 
  6.         this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, 
  7.              Executors.defaultThreadFactory(), defaultHandler); 
  8.     } 

這個方法里面有幾個參數

  • corePoolSize 要保留在池中的線程數,也就是線程池核心池的大小
  • maximumPoolSize 最大線程數
  • keepAliveTime 當線程數大于核心時,此為終止前多余的空閑線程等待新任務的最長時間。
  • unit keepAliveTime 參數的時間單位
  • workQueue 用來儲存等待執行任務的隊列。
  • threadFactory 線程工廠
  • handler 默認的拒絕執行處理程序

而這些參數也是面試中經常會問到的呦,而如何選擇合適的線程池,如何合理的配置線程池大小,請繼續關注阿粉,阿粉將會在最近幾天帶個大家,點個再看再走唄

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2023-03-30 07:34:10

Linux性能數據結構

2022-09-06 07:57:10

生命周期SpringIoC

2024-04-02 09:45:27

線程池Executors開發

2024-03-11 18:18:58

項目Spring線程池

2024-09-09 15:09:30

2024-09-12 08:35:06

2024-10-31 09:30:05

線程池工具Java

2021-12-02 08:19:06

MVCC面試數據庫

2021-05-08 07:53:33

面試線程池系統

2024-09-11 22:51:19

線程通訊Object

2022-11-15 17:45:46

數據庫MySQL

2021-04-08 10:51:10

主線程子線程Thread

2024-08-05 01:26:54

2020-09-17 17:53:12

面試ArrayList數組

2024-05-08 00:00:00

核心線程數隊列

2021-11-29 10:55:11

線程池Java面試

2022-07-13 17:47:54

布局Flex代碼

2021-03-01 18:42:02

緩存LRU算法

2022-06-24 06:43:57

線程池線程復用

2021-07-05 22:09:53

面試官CollectionsJDK7
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区三区四区在线观看 | 中文字幕在线观看一区二区 | 久热久热| 黄色片大全在线观看 | 欧美一级免费观看 | 精品成人一区 | 国产精品国产精品国产专区不蜜 | 日本免费黄色一级片 | 久久69精品久久久久久久电影好 | 日韩av一区二区在线观看 | 二区av | 日韩视频中文字幕 | 色橹橹欧美在线观看视频高清 | 欧美精品一区二区在线观看 | 欧美中文字幕在线观看 | 色资源在线观看 | 国产精品一区二区在线播放 | 中国美女一级黄色片 | 亚洲精品乱码久久久久v最新版 | 亚州无限乱码 | 一区二区三区视频在线免费观看 | 激情国产| 久久黄视频 | 日韩精品一区二区久久 | 一区二区三区国产好 | 欧美日韩综合精品 | 日韩成人精品 | 国产精品精品视频一区二区三区 | 国产xxx在线观看 | 日韩精品视频在线免费观看 | 成人午夜精品 | 亚洲精品一区二区三区丝袜 | 污片在线观看 | 日本aaaa| 久久精品久久久久久 | 色www精品视频在线观看 | 美女黄色在线观看 | 韩国毛片视频 | aaa在线观看 | 亚洲视频一区在线观看 | 91精品久久久久久久久中文字幕 |