Android線程篇(二):Java線程池

為什么要使用線程池呢?
我們知道線程的創建和銷毀是非常耗費資源的,有時候創建線程消耗的資源比執行任務所要耗費的資源都要大,為了防止資源不足,程序需要一些辦法來限制任何給定時刻處理的請求數目,盡可能減少創建和銷毀線程的次數,特別是一些資源耗費比較大的線程的創建和銷毀,盡量利用已有對象來進行服務,這就是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個線程執行

  1. 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
  1. newSingleThreadExecutor:創建一個單線程的線程池,即這個線程池永遠只有一個線程在運行,這樣能保證所有任務按指定順序來執行。如果這個線程異常結束,那么會有一個新的線程來替代它。
      var myPool=Executors.newSingleThreadExecutor()
        for (i in 0 until 10){
            myPool.execute(Runnable {
                Thread.sleep(500)
                println("<<<<<Name:"+Thread.currentThread().name+"<<<<"+i)
            })
        }

Log:


  1. 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:



好了,四種線程池就講到這里,下篇文章講解,Java線程池實現原理

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容