Android執行緒篇(三)深入理解Java執行緒池(一)

Android開發者社群發表於2017-12-21

Android執行緒篇(三)深入理解Java執行緒池(一)

“Android開發者社群”微信群期待各位加入,我們一起“摳腚”,一起進步,一起探討技術……
微信ID:393795397 掘金主頁:Android開發者社群

為什麼要使用執行緒池呢? 我們知道執行緒的建立和銷燬是非常耗費資源的,有時候建立執行緒消耗的資源比執行任務所要耗費的資源都要大,為了防止資源不足,程式需要一些辦法來限制任何給定時刻處理的請求數目,儘可能減少建立和銷燬執行緒的次數,特別是一些資源耗費比較大的執行緒的建立和銷燬,儘量利用已有物件來進行服務,這就是Java執行緒池產生的原因,也是它要解決的問題。

下面來講解Java執行緒池

Java通過Executors提供了四類執行緒池:

  1. newFixedThreadPool:建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待,如果執行緒池中的某個執行緒由於異常而結束,執行緒池則會再補充一條新執行緒。 For example:
        //建立執行緒數為5的執行緒池
        var myPool=Executors.newFixedThreadPool(5)
        for (i in 0 until 10){
            myPool.execute(Runnable {
                Thread.sleep(500)
                println("<<<<<Name:"+Thread.currentThread().name+"<<<<"+i)
            })
        }
複製程式碼

Log:

image.png
結論:  任務在1-5個執行緒執行 2. newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。 延遲2秒後執行執行緒

 var myPool=Executors.newScheduledThreadPool(5)
        myPool.schedule(Runnable {
             println("<<<<<Name:"+Thread.currentThread().name)

        },2,TimeUnit.SECONDS)
複製程式碼

延遲1秒後執行執行緒,之後美倆秒執行一次

var myPool=Executors.newScheduledThreadPool(5)
        myPool.scheduleAtFixedRate(Runnable {
             println("<<<<<Name:"+Thread.currentThread().name)

        },1,2,TimeUnit.SECONDS)
複製程式碼

Log:

image.png
3. newSingleThreadExecutor:建立一個單執行緒的執行緒池,即這個執行緒池永遠只有一個執行緒在執行,這樣能保證所有任務按指定順序來執行。如果這個執行緒異常結束,那麼會有一個新的執行緒來替代它。

      var myPool=Executors.newSingleThreadExecutor()
        for (i in 0 until 10){
            myPool.execute(Runnable {
                Thread.sleep(500)
                println("<<<<<Name:"+Thread.currentThread().name+"<<<<"+i)
            })
        }

複製程式碼

Log:

4. newCachedThreadPool:建立一個可快取執行緒池,當執行緒池中有之前建立的可用執行緒就重用之前的執行緒,否則就新建一條執行緒,。如果執行緒池中的執行緒在60秒未被使用,就會把它從執行緒池中移除,可靈活回收空閒執行緒。

        var myPool=Executors.newCachedThreadPool()
        for (i in 0 until 10){
            myPool.execute(Runnable {
                Thread.sleep(500)
                println("<<<<<Name:"+Thread.currentThread().name+"<<<<"+i)
            })
        }
複製程式碼

Log:

Android執行緒篇(三)深入理解Java執行緒池(一)
好了,四種執行緒池就講到這裡,下篇文章講解,Java執行緒池實現原理

相關文章