多執行緒面試題

2021-09-13 09:06:11 字數 2704 閱讀 5499

執行緒池的優點?

執行緒是稀缺資源,使用執行緒池可以減少建立和銷毀執行緒的次數,每個工作執行緒都可以重複使用。

執行緒池為執行緒生命週期開銷問題和資源不足問題提供了解決方案。可以根據系統的承受能力,調整執行緒池中工作執行緒的數量,防止因為消耗過多記憶體導致伺服器崩潰。

public threadpoolexecutor(int corepoolsize,

int maximumpoolsize,

long keepalivetime,

timeunit unit,

blockingqueueworkqueue,

threadfactory threadfactory,

rejectedexecutionhandler handler)

corepoolsize:執行緒池核心執行緒數量

maximumpoolsize:執行緒池最大執行緒數量

keepalivertime:當活躍執行緒數大於核心執行緒數時,空閒的多餘執行緒最大存活時間,所以如果任務很多,並且每個任務執行的時間比較短,可以適當調大這個引數來提高執行緒的利用率。

unit:存活時間的單位,可選的單位:天(days),小時(hours),分鐘(minutes),毫秒(milliseconds),微秒(microseconds)和納秒(nanoseconds)

workqueue:存放任務的佇列。用來存放我們所定義的任務處理執行緒,blockingqueue是一種帶鎖的阻塞佇列。blockingqueue有四種選擇:(1)arrayblockingqueue,是一種基於陣列的有界阻塞佇列,此佇列按 fifo(先進先出)原則對元素進行操作;2)linkedblockingqueue,是乙個基於鍊錶的阻塞佇列,此佇列也按fifo (先進先出)對元素進行操作,吞吐量通常要高於arrayblockingqueue, executors.newfixedthreadpool()使用了這種佇列;3)synchronousqueue;是一種不儲存元素的阻塞佇列,每個插入操作必須等另乙個執行緒呼叫移除操作,否則插入操作一直處於阻塞狀態,吞吐量通常要高於linkedblockingqueue,executors.newcachedthreadpool使用了這個佇列;(4)priorityblockingqueue,是一種具有優先權的阻塞佇列,優先順序大的任務可以先執行,使用者由此可以控制任務的執行順序。

threadfactory 建立新執行緒時使用的工廠,threadfactory有兩種選擇:(1)defaultthreadfactory,將建立乙個同執行緒組且預設優先順序的執行緒;(2)privilegedthreadfactory,使用訪問許可權建立乙個許可權控制的執行緒。threadpoolexecutor預設採用defaultthreadfactory

handler:超出執行緒範圍和佇列容量的任務的處理程式。handler有四個選擇:(1)threadpoolexecutor.abortpolicy(),將丟擲rejectedexecutionexception異常;(2)threadpoolexecutor.callerrunspolicy(),將重試新增當前的任務,重複呼叫execute()方法;(3)threadpoolexecutor.discardoldestpolicy(),將拋棄舊任務;(4)threadpoolexecutor.discardpolicy,將直接拋棄任務。threadpoolexecutor預設採用abortpolicy。

提交乙個任務到執行緒池中,執行緒池的處理流程如下: 

判斷執行緒池裡的核心執行緒是否都在執行任務,如果不是(核心執行緒空閒或者還有核心執行緒沒有被建立)則建立乙個新的工作執行緒來執行任務。如果核心執行緒都在執行任務,則進入下個流程。

執行緒池判斷工作佇列是否已滿,如果工作佇列沒有滿,則將新提交的任務儲存在這個工作佇列裡。如果工作佇列滿了,則進入下個流程。

判斷執行緒池裡的執行緒是否都處於工作狀態,如果沒有,則建立乙個新的工作執行緒來執行任務。如果已經滿了,則交給飽和策略來處理這個任務。

常用的執行緒池。

public static executorservice newsinglethreadexecutor()

建立僅有乙個執行緒工作的執行緒池,相當於單執行緒序列執行所有任務。如果這個唯一的執行緒因為異常結束,那麼將建立有乙個新的執行緒來替代它。此執行緒池保證所有任務的執行順序按照任務的提交順序執行。

public static executorservice newcachedthreadpool()

建立乙個快取執行緒池,如果執行緒池的大小超過了任務所需要的執行緒,那麼就會**部分空閒(60秒不執行任務)的執行緒,當任務數增加時,此執行緒池又動態新增新執行緒來處理任務。此執行緒池沒有對執行緒池大小做限制,執行緒池大小完全依賴於作業系統(或者說jvm)所能夠建立的最大執行緒大小。

public static executorservice newfixedthreadpool(int nthreads)

建立指定大小的執行緒池。每次提交乙個任務就建立乙個執行緒,直到執行緒數量達到執行緒池的最大值。執行緒池的大小一旦達到最大值就會保持不變,如果某個執行緒因為執行異常而結束,那麼執行緒池會補充乙個新執行緒。

public static scheduledexecutorservice newscheduledthreadpool(int corepoolsize)

類似於newcachedthreadpool,建立乙個快取執行緒池,此執行緒池還支援定時以及週期性執行任務。

多執行緒面試題

題目 主線程執行10次,子執行緒執行10次,此過程重複50次 package com.thread.test function 主線程執行10次,子執行緒執行10次,此過程重複50次 public class threadproblem start for int j 0 j 50 j class ...

面試題 多執行緒

現有程式同時啟動了4個執行緒去呼叫testdo.dosome key,value 方法,由於testdo.dosome key,value 方法內的 是先暫停1秒,然後再輸出以秒為單位的當前時間值,所以,會列印出4個相同的時間值,如下所示 4 4 1258199615 1 1 1258199615 ...

linux 多執行緒 面試題

剛無意中看到morewindows博主秒殺多執行緒面試題 第一篇就有他收集的面試題。那我就用來檢驗一下自己學的怎麼樣吧。前面的選擇題那些跳過,直接看最後的程式設計題。子執行緒迴圈10 次,接著主線程迴圈100 次,接著又回到子執行緒迴圈10 次,接著再回到主線程又迴圈100 次,如此迴圈50次,試寫...