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

面試官因?yàn)榫€程池,讓我出門左拐!

網(wǎng)絡(luò)
前幾天阿粉的朋友面試,在面試的時(shí)候,面試官問(wèn)到了框架,項(xiàng)目,JVM還有一些關(guān)于線程池的內(nèi)容,而這個(gè)線程池,讓阿粉的朋友分分鐘被面試官吊打,只能出門左拐,地鐵站回家了。為什么呢?因?yàn)榫€程池他是真的沒(méi)有下功夫去準(zhǔn)備,只能涼涼了。

前幾天阿粉的朋友面試,在面試的時(shí)候,面試官問(wèn)到了框架,項(xiàng)目,JVM還有一些關(guān)于線程池的內(nèi)容,而這個(gè)線程池,讓阿粉的朋友分分鐘被面試官吊打,只能出門左拐,地鐵站回家了。為什么呢?因?yàn)榫€程池他是真的沒(méi)有下功夫去準(zhǔn)備,只能涼涼了。

[[327119]]

前序說(shuō)實(shí)話,阿粉在面試的時(shí)候,最開(kāi)始的時(shí)候的面試,面試官只是會(huì)問(wèn)實(shí)現(xiàn)多線程的方式都有哪些,但是你說(shuō)到關(guān)于線程池的內(nèi)容的時(shí)候,都是一句帶過(guò),而有些面試官對(duì)這個(gè)也不是很細(xì)抓,但是自從阿里的面試官開(kāi)始問(wèn)關(guān)于線程池的問(wèn)題之后,這個(gè)問(wèn)題就成了高頻熱點(diǎn)了。

那么接下來(lái),阿粉就繼續(xù)帶給大家關(guān)于這個(gè)線程池,如何分分鐘擺平面試官。

1.什么是線程池

java.util.concurrent.Executors 這個(gè)類大家不知道有沒(méi)有仔細(xì)的去看過(guò)這個(gè),而這個(gè)類中給我提供了很多方法來(lái)創(chuàng)建線程池。

在代碼的開(kāi)頭的注釋上就寫明了,它可以創(chuàng)建重復(fù)使用固定數(shù)量線程的線程池,如果在所有線程都處于活動(dòng)狀態(tài)時(shí)提交了其他任務(wù),那么他們將在隊(duì)列中等待線程可用。

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

而我們創(chuàng)建線程池就是為了解決處理器單元內(nèi)多個(gè)線程執(zhí)行的問(wèn)題,它可以顯著減少處理器單元的閑置時(shí)間,增加處理器單元的吞吐能力。

而面試的時(shí)候,我們肯定不能這么說(shuō),面試的時(shí)候我們可以這么說(shuō):

做Java的,當(dāng)然知道線程池,我們?cè)谧鲩_(kāi)發(fā)的時(shí)候有時(shí)候需要做的任務(wù)慢慢的增多,復(fù)雜性也會(huì)變得越來(lái)越強(qiáng),所以線程的個(gè)數(shù)就會(huì)一點(diǎn)點(diǎn)的往上增加,而對(duì)應(yīng)的線程占用的資源也就越來(lái)越多,多個(gè)線程占用資源的釋放與注銷需要維護(hù),這時(shí)候多個(gè)線程的管理就顯得有尤為重要。針對(duì)這一情況,sun公司提供了線程池,對(duì)線程集合的管理工具。所以線程池就出現(xiàn)了,接下來(lái)面試官的問(wèn)題就是比較狠了,你平常是怎么使用的,幾種常見(jiàn)的都有哪些,畢竟面試官的套路一環(huán)套一環(huán)。

2.常見(jiàn)的線程池都有哪些,使用的場(chǎng)景是哪里呢?

這時(shí)候這個(gè)java.util.concurrent.Executors 類大家就排上用場(chǎng)了,比如:

(1) newSingleThreadExecutor

  1. 單個(gè)線程的線程池,即線程池中每次只有一個(gè)線程工作,單線程串行執(zhí)行任務(wù) 
  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

下面的兩個(gè)方法是這個(gè)方法的重載,而它的意思很明確,建立一個(gè)線程數(shù)量固定的線程池,規(guī)定的最大線程數(shù)量,超過(guò)這個(gè)數(shù)量之后進(jìn)來(lái)的任務(wù),會(huì)放到等待隊(duì)列中,如果有空閑線程,則在等待隊(duì)列中獲取,遵循先進(jìn)先出原則。

  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

緩存型線程池,這個(gè)線程池的意思是在核心線程達(dá)到最大值之前,如果繼續(xù)有任務(wù)進(jìn)來(lái)就會(huì)創(chuàng)建新的核心線程,并加入核心線程池,即使有空閑的線程,也不會(huì)復(fù)用。

而達(dá)到最大核心線程數(shù)后,新任務(wù)進(jìn)來(lái),如果有空閑線程,則直接拿來(lái)使用,如果沒(méi)有空閑線程,則新建臨時(shí)線程.

而緩存型的線程池使用的是SynchronousQueue作為等待隊(duì)列,他不保存任何的任務(wù),新的任務(wù)加入進(jìn)來(lái)之后,他會(huì)創(chuàng)建臨時(shí)線程來(lái)進(jìn)行使用

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

(4)newScheduledThreadPool

計(jì)劃型線程池,在它的注釋中給出的很明確的解釋,創(chuàng)建一個(gè)線程池,該線程池可以計(jì)劃在給定的延遲,或周期性地執(zhí)行。

也就是說(shuō),在新任務(wù)到達(dá)的時(shí)候,我們看到底有沒(méi)有空閑線程,如果有,直接拿來(lái)使用,如果沒(méi)有,則新建線程加入池。而這里面使用的就是DelayedWorkQueue作為等待隊(duì)列,中間進(jìn)行了一定的等待,等待時(shí)間過(guò)后,繼續(xù)執(zhí)行任務(wù)。

  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.你看過(guò)阿里巴巴開(kāi)發(fā)手冊(cè)么?里面對(duì)線程是怎么說(shuō)的?說(shuō)實(shí)話,阿粉是一開(kāi)始真的沒(méi)怎么注意過(guò)這個(gè)在阿里巴巴開(kāi)發(fā)手冊(cè)上關(guān)于線程的使用,是怎么做的,而面試官很明顯,問(wèn)出這個(gè)問(wèn)題的時(shí)候,肯定是看過(guò)了,之后阿粉看了阿里巴巴開(kāi)發(fā)手冊(cè),不得不感慨,阿里巴巴,真的是..

我們?cè)谌粘J褂枚际菚?huì)出現(xiàn)這段代碼:

  1. ExecutorService cachedThreadPool=Executors.newFixedThreadPool(); 

但是阿里巴巴說(shuō),不好意思呀,強(qiáng)制線程池不允許使用 Executors 去創(chuàng)建

那你說(shuō)嘛,我該怎么辦,而推薦的卻是 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.     } 

這個(gè)方法里面有幾個(gè)參數(shù)

  • corePoolSize 要保留在池中的線程數(shù),也就是線程池核心池的大小
  • maximumPoolSize 最大線程數(shù)
  • keepAliveTime 當(dāng)線程數(shù)大于核心時(shí),此為終止前多余的空閑線程等待新任務(wù)的最長(zhǎng)時(shí)間。
  • unit keepAliveTime 參數(shù)的時(shí)間單位
  • workQueue 用來(lái)儲(chǔ)存等待執(zhí)行任務(wù)的隊(duì)列。
  • threadFactory 線程工廠
  • handler 默認(rèn)的拒絕執(zhí)行處理程序

而這些參數(shù)也是面試中經(jīng)常會(huì)問(wèn)到的呦,而如何選擇合適的線程池,如何合理的配置線程池大小,請(qǐng)繼續(xù)關(guān)注阿粉,阿粉將會(huì)在最近幾天帶個(gè)大家,點(diǎn)個(gè)再看再走唄

 

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2023-03-30 07:34:10

Linux性能數(shù)據(jù)結(jié)構(gòu)

2022-09-06 07:57:10

生命周期SpringIoC

2024-04-02 09:45:27

線程池Executors開(kāi)發(fā)

2024-03-11 18:18:58

項(xiàng)目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面試數(shù)據(jù)庫(kù)

2021-05-08 07:53:33

面試線程池系統(tǒng)

2024-09-11 22:51:19

線程通訊Object

2022-11-15 17:45:46

數(shù)據(jù)庫(kù)MySQL

2021-04-08 10:51:10

主線程子線程Thread

2024-08-05 01:26:54

2020-09-17 17:53:12

面試ArrayList數(shù)組

2021-11-29 10:55:11

線程池Java面試

2024-05-08 00:00:00

核心線程數(shù)隊(duì)列

2022-07-13 17:47:54

布局Flex代碼

2021-03-01 18:42:02

緩存LRU算法

2022-06-24 06:43:57

線程池線程復(fù)用

2021-07-05 22:09:53

面試官CollectionsJDK7
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 人成在线视频 | 日本免费黄色一级片 | 精品欧美乱码久久久久久 | 精品无码久久久久久久动漫 | 国产精品a一区二区三区网址 | 极品电影院 | www.99re| 中文字幕亚洲欧美日韩在线不卡 | 日韩在线不卡视频 | 激情欧美一区二区三区中文字幕 | 精品欧美激情在线观看 | 色五月激情五月 | 国产精久久久久久久妇剪断 | 成人免费视频 | 欧美日本高清 | 国产成人jvid在线播放 | 综合久久av| 精品久久久久久亚洲综合网站 | 日韩成人精品在线观看 | 国产午夜精品视频 | 国产精品无 | 黄一区二区三区 | 亚洲视频免费在线观看 | 亚洲欧美综合 | 一区二区三区在线 | 欧 | 在线欧美视频 | 日韩精品免费一区二区在线观看 | 在线亚州 | 亚洲一区二区三区高清 | 欧美日韩精品在线免费观看 | 精品美女视频在线观看免费软件 | 日韩欧美综合 | 亚洲视频免费 | 精彩视频一区二区三区 | 成人av一区二区三区 | 日韩精品一区二区在线观看 | 一区二区三区在线电影 | 国产福利精品一区 | 免费一区二区三区 | 天天操天天射综合 | 中文字幕在线观看www |