06.18 2018必會java面試題-線程池試題集-控制某個方法允許併發訪問個數

面試題1、什麼是線程池,如何使用?

線程池就是先將多個線程對象放到一個容器中,當使用的時候就不用new線程而是直接從線程池中拿線程即可,節省了開闢子線程的時間,提高了代碼執行效率。在JDK的java.util.concurrent.Executors中提供了生成多種線程池的靜態方法。這裡列舉4種方式:

  1. ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
  2. ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(4);
  3. ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(4);
  4. ExecutorService newSingleThreadExecutor = Executors.newSingleThreadExecutor();

然後調用它們的execute方法即可。

面試題2、常用的線程池有哪些?

  • newSingleThreadExecutor:創建一個單線程的線程池,此線程池保證所有任務的執行順序按照任務的提交順序執行。
  • newFixedThreadPool:創建固定大小的線程池,每次提交一個任務就創建一個線程,直到線程達到線程池的最大大小。
  • newCachedThreadPool:創建一個可緩存的線程池,此線程池不會對線程池大小做限制,線程池的大小完全依賴於操作系統(或者說JVM)能夠創建的最大線程大小。
  • newScheduledThreadPool:創建一個大小無限的線程池,此線程池支持定時以及週期性執行任務的需求。

面試題3、談談您對線程池的理解?

(一般如果遇到了這樣的問題,可以展開說一下線程池如何使用、線程池的好處、線程池的啟動策略等)合理的利用線程池帶來的三個好處:

  1. 降低資源消耗。通過重複利用已創建的線程降低線程創建和銷燬造成的消耗。
  2. 提高響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。
  3. 提高線程的可管理性。線程是稀缺資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控。

面試題4、線程池的啟動策略?

官方對線程池的執行過程描述如下圖

2018必會java面試題-線程池試題集-控制某個方法允許併發訪問個數

  1. 線程池剛創建時,裡面沒有一個線程。任務隊列是作為參數傳進來的。不過,就算隊列裡面有任務,線程池也不會馬上去執行它們。
  2. 當調用execute()方法添加一個任務時,線程池會做如下判斷:
  • 如果正在運行的線程數量小於corePoolSize,那麼馬上創建線程運行這個任務;
  • 如果正在運行的線程數量大於或等於corePoolSize,那麼將這個任務放入隊列;
  • 如果這時隊列滿了,而且正在運行的線程數量小於maximumPoolSize,那麼還是要創建線程運行這個任務;
  • 如果隊列滿了,而且正在運行的線程數量大於或等於maximumPoolSize,那麼線程池會拋出異常,告訴調用者“我不能再接受任務了”。

3.當一個線程完成任務時,它會從隊列中取下一個任務來執行。

4.當一個線程無事可做,超過一定的時間(keepAliveTime)時,線程池會判斷,如果當前運行的線程數大於corePoolSize,那麼這個線程就被停掉。所以線程池的所有任務完成後,它最終會縮到corePoolSize的大小。

2018必會java面試題-線程池試題集-控制某個方法允許併發訪問個數

線程池的主要處理流程

面試題4、如何控制某個方法允許併發訪問線程的個數?

演示源碼如下

2018必會java面試題-線程池試題集-控制某個方法允許併發訪問個數

控制方法允許的併發線程數

2018必會java面試題-線程池試題集-控制某個方法允許併發訪問個數

演示效果圖

可以使用Semaphore控制,由上源碼演示效果圖可以看出,test()方法始終只允許5個線程併發訪問,出去一個才能進來一個,出去3個才能進來3個。

2018必會java面試題-線程池試題集-控制某個方法允許併發訪問個數


分享到:


相關文章: