1. 程式人生 > >關於java執行緒池的利與弊、優化等的見解

關於java執行緒池的利與弊、優化等的見解

下面的圖是執行緒池的類的繼承關係,頂級的Executor,是一個執行緒執行的工具。真正的執行緒介面是ExecutorService,裡面包含提交兩種執行緒的操作,Runnable和Callable。ScheduledExecutorService,解決那些需要任務重複執行的問題。ScheduledThreadPoolExcutor是週期性任務排程的類的實現可以建立三種執行緒池。

    1、newFixedThreadPool建立一個指定工作執行緒數量的執行緒池。每當提交一個任務就建立一個工作執行緒,如果工作執行緒數量達到執行緒池初始的最大數,則將提交的任務存入到池佇列中。

    2、newCachedThreadPool建立一個可快取的執行緒池。這種型別的執行緒池特點是: 
    1).工作執行緒的建立數量幾乎沒有限制(其實也有限制的,數目為Interger. MAX_VALUE), 這樣可靈活的往執行緒池中新增執行緒。 
    2).如果長時間沒有往執行緒池中提交任務,即如果工作執行緒空閒了指定的時間(預設為1分鐘),則該工作執行緒將自動終止。終止後,如果你又提交了新的任務,則執行緒池重新建立一個工作執行緒。

    3、newSingleThreadExecutor建立一個單執行緒化的Executor,即只建立唯一的工作者執行緒來執行任務,如果這個執行緒異常結束,會有另一個取代它,保證順序執行(我覺得這點是它的特色)。單工作執行緒最大的特點是可保證順序地執行各個任務,並且在任意給定的時間不會有多個執行緒是活動的 。

    4、newScheduleThreadPool建立一個定長的執行緒池,而且支援定時的以及週期性的任務執行,類似於Timer。(這種執行緒池原理暫還沒完全瞭解透徹)

    總結: 一.FixedThreadPool是一個典型且優秀的執行緒池,它具有執行緒池提高程式效率和節省建立執行緒時所耗的開銷的優點。但是,線上程池空閒時,即執行緒池中沒有可執行任務時,它不會釋放工作執行緒,還會佔用一定的系統資源。

        二.CachedThreadPool的特點就是線上程池空閒時,即執行緒池中沒有可執行任務時,它會釋放工作執行緒,從而釋放工作執行緒所佔用的資源。但是,但當出現新任務時,又要建立一新的工作執行緒,又要一定的系統開銷。並且,在使用CachedThreadPool時,一定要注意控制任務的數量,否則,由於大量執行緒同時執行,很有會造成系統癱瘓。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------以上轉自其他部落格

既然以後的執行緒池都有一些缺點,而我理想中的執行緒池是希望具有亮點優勢:第一,可以提高系統的資源利用率,但是不至於讓系統崩潰;第二,在沒有請求的情況下,釋放全部資源。

所以,感覺在實際場景下,需要集合兩個機制才能做出一個滿意的執行緒池:

1,newCachedThreadPool的在工作執行緒空閒了指定時間後,該執行緒自動終止的機制

2,使用者提交過來的請求,限制響應執行緒的數目,多餘的放在等待佇列。

所以,讓我想起了前幾天和同學討論的java的執行緒池真的適用各種場景的問題,我覺得這個已經不適合了,建議後續需要使用執行緒池的小夥伴最好還是自己寫一個最好。