- run()\strart()
run()是在本线程里的一个函数,若直接调用run()相当于调用一个函数;
start()用于启动一个线程 - 使用线程池比直接使用线程执行效率高
线程的重复利用
(创建和销毁线程需要消费大量时间) - 线程池类ThreadPoolExecutor的参数
public ThreadPoolExecutor(int corePoolSize, //核心线程数(日常开销)
int maximumPoolSize, //最大线程数(核心不够时临时增加非核心线程)
long keepAliveTime, //线程最大空闲时间(临时的使用时间)
TimeUnit unit, //时间单位
BlockingQueue<Runnable> workQueue, //队列(当量很多时需要排队等待)
ThreadFactory threadFactory, //线程工厂
//拒绝策略(当量实在很大,队列已满则拒绝)
RejectedExecutionHandler handler ) {
}
CachedThreadPool:corePoolSize = 0,maximumPoolSize = Integer.MAX_VALUE,即线程数量几乎无限制;即有几个任务就创建几个线程,会导致CPU100%(也会导致内存溢出但在之前就CPU100%)。
FixedThreadPool:corePoolSize与maximumPoolSize相等,即其线程全为核心线程;workQueue 为LinkedBlockingQueue(无界阻塞队列),队列最大值为Integer.MAX_VALUE;即有多少个任务(多出核心线程数)就会创建多少个存储节点,会导致内存溢出。
总结:使用自定义线程池
4. 执行优先级、提交优先级
提交:核心>队列>非核心
执行:核心>非核心>队列
在该技术博客中有具体线程类说明以及例子