Kotlin中使用newCachedThreadPool

1、new Thread的弊端

new Thread(new Runnable() {
 
	@Override
	public void run() {
		// TODO Auto-generated method stub
	}
}).start();
a. 每次new Thread新建对象性能差。每次在创建线程和关闭线程上有一定的耗时和耗能。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。

2.java线程池: newCachedThreadPool

      名为cached-threadpool的原因在于线程池中的线程是被线程池缓存了的,也就是说,线程没有任务要执行时,便处于空闲状态,处于空闲状态的线程并不会被立即销毁(会被缓存住),只有当空闲时间超出一段时间(默认为60s)后,线程池才会销毁该线程(相当于清除过时的缓存)。新任务到达后,线程池首先会让被缓存住的线程(空闲状态)去执行任务,如果没有可用线程(无空闲线程),便会创建新的线程。
    在平时我们工作中肯定少不了自己开线程,现在我们可以封装一个newCachedThreadPool来为整个代码工程提供一个公用的开线程方法,首先我们New Kotlin File 
   
import java.util.concurrent.Executors
import java.util.concurrent.ThreadFactory


/**
 *  @Author: fc
 *  @Date: 16:12 2017/10/18
 */


private val newThreadPool by lazy {
    Executors.newCachedThreadPool(object : ThreadFactory {
        var count = 0
        override fun newThread(r: Runnable?): Thread {
            println("新开的线程: newThreadPool_$count")
            val thread = Thread(r, "newThreadPool_${count++}")
            thread.setUncaughtExceptionHandler { t, e -> //处理非正常的线程中止,多线程中通过trycatch试图捕获线程的异常是不可取的
                println(t.name)
                e.printStackTrace()
            }
            return thread
        }
    })
}

fun newThread(r: () -> Unit) {
    newThreadPool.execute(r)
}
写一个测试类使用公用的newThread方法:
class TestThreadUtil {
    init {
        for (i in 0..5){
            println("for $i")
            newThread {
//            业务代码
            }

        }

    }
}
在main函数中执行,( kotlin中的main函数也是创建一个kotlin file
fun main(args: Array<String>) {
    val testThread = TestThreadUtil()

}

运行结果:
for 0
新开的线程: newThreadPool_0
for 1
新开的线程: newThreadPool_1
for 2
for 3
新开的线程: newThreadPool_2
for 4
for 5
新开的线程: newThreadPool_3


我们可以看见在for循环中new了6个线程,但是实际上值创建了四个线程。原因就是新任务到达后,线程池首先会让被缓存住的线程(空闲状态)去执行任务,如果没有可用线程(无空闲线程),便会创建新的线程。


    
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值