為什么要使用線程池呢?
我們知道線程的創建和銷毀是非常耗費資源的,有時候創建線程消耗的資源比執行任務所要耗費的資源都要大,為了防止資源不足,程序需要一些辦法來限制任何給定時刻處理的請求數目,盡可能減少創建和銷毀線程的次數,特別是一些資源耗費比較大的線程的創建和銷毀,盡量利用已有對象來進行服務,這就是Java線程池產生的原因,也是它要解決的問題。
下面來講解Java線程池
Java通過Executors提供了四類線程池:
- 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個線程執行
- 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
- newSingleThreadExecutor:創建一個單線程的線程池,即這個線程池永遠只有一個線程在運行,這樣能保證所有任務按指定順序來執行。如果這個線程異常結束,那么會有一個新的線程來替代它。
var myPool=Executors.newSingleThreadExecutor()
for (i in 0 until 10){
myPool.execute(Runnable {
Thread.sleep(500)
println("<<<<<Name:"+Thread.currentThread().name+"<<<<"+i)
})
}
Log:
- 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線程池實現原理