“Android开发者社区”微信群期待各位加入,我们一起“抠腚”,一起进步,一起探讨技术……
微信ID:393795397 掘金主页:Android开发者社区
为什么要使用线程池呢? 我们知道线程的创建和销毁是非常耗费资源的,有时候创建线程消耗的资源比执行任务所要耗费的资源都要大,为了防止资源不足,程序需要一些办法来限制任何给定时刻处理的请求数目,尽可能减少创建和销毁线程的次数,特别是一些资源耗费比较大的线程的创建和销毁,尽量利用已有对象来进行服务,这就是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:
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:
var myPool=Executors.newSingleThreadExecutor()
for (i in 0 until 10){
myPool.execute(Runnable {
Thread.sleep(500)
println("<<<<<Name:"+Thread.currentThread().name+"<<<<"+i)
})
}
复制代码
Log:
var myPool=Executors.newCachedThreadPool()
for (i in 0 until 10){
myPool.execute(Runnable {
Thread.sleep(500)
println("<<<<<Name:"+Thread.currentThread().name+"<<<<"+i)
})
}
复制代码
Log: