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()
}