實現(xiàn) 工作者workers結(jié)構(gòu)與并發(fā)保護(hù) 待處理工作隊列結(jié)構(gòu) JDK 使用了HashSet來存儲工作者workers,通過可重入鎖ReentrantLock對其進(jìn)行并發(fā)保護(hù)。每個worker都是一個Runnable接口。 使用了實現(xiàn)接口BlockingQueue的阻塞隊列來存儲待處理工作job,并把隊列作為構(gòu)造函數(shù)參數(shù),從而實現(xiàn)業(yè)務(wù)可以靈活的擴展定制 線程池的隊列。業(yè)務(wù)也可使用JDK自身的同步阻塞隊列SynchronousQueue、有界隊列ArrayBlockingQueue、無界隊列 LinkedBlockingQueue、優(yōu)先級隊列PriorityBlockingQueue。 Jetty6 同樣使用了HashSet存儲工作者workers,通過synchronized一個對象進(jìn)行HashSet的并發(fā)保護(hù)。每個工作者實際上是一個Thread的擴展。 使用了數(shù)組存儲待處理的job對象Runnable。數(shù)組初始化容量為_maxThreads個,使用變量_queued計算保存當(dāng)前內(nèi)部 待處理job的個數(shù)即數(shù)組length。超過數(shù)組最大值時,擴大_maxThreads個容量,因此數(shù)組永遠(yuǎn)夠用夠大,容量無界。同樣是用 synchronized一個對象的方式實現(xiàn)同步。 Jetty8 使用了ConcurrentLinkedQueue存儲工作者workers,利用JDK基于CAS算法的實現(xiàn)提高了并發(fā)效率,同時也降低 了線程池并發(fā)保護(hù)的復(fù)雜程度。針對隊列ConcurrentLinkedQueue無法保證size()實時性問題引入原子變量 AtomicInteger統(tǒng)計工作者數(shù)量。 與JDK相同實現(xiàn),使用了基于接口BlockingQueue的阻塞隊列來存儲待處理工作job,也支持在線程池構(gòu)造函數(shù)的參數(shù)中傳入隊列 類型。同時,Jetty8內(nèi)部默認(rèn)未設(shè)置隊列類型場景可自動設(shè)置使用2種隊列:有界無法擴容的ArrayBlockingQueue及Jetty自身定制 擴展實現(xiàn)的可擴容隊列BlockingArrayQueue。 Tomcat 基于JDK的ThreadPoolExecutors實現(xiàn),復(fù)用JDK業(yè)務(wù) 復(fù)用JDK業(yè)務(wù) |
|
來自: 小新丸子rdyfps > 《Java》