1. 程式人生 > >【面試總結】java多執行緒

【面試總結】java多執行緒

 

 

4.1 ThreadLocal為什麼會產生記憶體洩露(建議結合原始碼學習)

      https://blog.csdn.net/puppylpg/article/details/80433271

4.2 讀寫鎖可同時讀,讀的時候不能寫,寫的時候不能讀

4.3自定義執行緒池

https://www.cnblogs.com/yaoxiaowen/p/6576898.html

 

 public ThreadPoolExecutor(int corePoolSize,

                              int maximumPoolSize,

                              long

 keepAliveTime,

                              TimeUnit unit,

                              BlockingQueue<Runnable> workQueue,

                              ThreadFactory threadFactory,

                              RejectedExecutionHandler handler)

 

corePoolSize:核心執行緒池的大小,線上程池被建立之後,其實裡面是沒有執行緒的。(當然,呼叫prestartAllCoreThreads()或者prestartCoreThread()方法會預建立執行緒,而不用等著任務的到來)。當有任務進來的時候,才會建立執行緒。當執行緒池中的執行緒數量達到corePoolSize之後,就把任務放到 快取隊列當中。(就是 workQueue)。

maximumPoolSize:最大執行緒數量是多少。它標誌著這個執行緒池的最大執行緒數量。如果沒有最大數量,當建立的執行緒數量達到了 某個極限值,到最後記憶體肯定就爆掉了。
keepAliveTime:當執行緒沒有任務時,最多保持的時間,超過這個時間就被終止了。預設情況下,只有 執行緒池中執行緒數量 大於 corePoolSize時,keepAliveTime值才會起作用。也就說說,只有在執行緒池執行緒數量超出corePoolSize了。我們才會把超時的空閒執行緒給停止掉。否則就保持執行緒池中有 corePoolSize 個執行緒就可以了。


Unit:引數keepAliveTime的時間單位,就是 TimeUnit類當中的幾個屬性。

workQueue:用來儲存待執行任務的佇列,不同的執行緒池它的佇列實現方式不同(因為這關係到排隊策略的問題)比如有以下幾種
        ArrayBlockingQueue:基於陣列的佇列,建立時需要指定大小。
        LinkedBlockingQueue:基於連結串列的佇列,如果沒有指定大小,則預設值是 Integer.MAX_VALUE。(newFixedThreadPool和newSingleThreadExecutor使用的就是這種佇列)。
       SynchronousQueue:這種佇列比較特殊,因為不排隊就直接建立新執行緒把任務提交了。(newCachedThreadPool使用的就是這種佇列)。

threadFactory:執行緒工廠,用來建立執行緒。

Handler:拒絕執行任務時的策略,一般來講有以下四種策略,
       (1) ThreadPoolExecutor.AbortPolicy 丟棄任務,並丟擲 RejectedExecutionException 異常。
       (2) ThreadPoolExecutor.CallerRunsPolicy:該任務被執行緒池拒絕,由呼叫 execute方法的執行緒執行該任務。
       (3) ThreadPoolExecutor.DiscardOldestPolicy : 拋棄佇列最前面的任務,然後重新嘗試執行任務。
       (4) ThreadPoolExecutor.DiscardPolicy,丟棄任務,不過也不丟擲異常。