4. 线程池使用
线程池: 如果线程的数量很多,并且每个线程都是执行一个时间很短的任务就结束,这样频繁创建线程会大大增加系统的开销,因为创建和消毁线程都需要资源和时间的
简单实例:
分析:
以上就是直接new一个线程池出来运行,但是阿里开发手册禁止使用该方法来启动一个线程池.而推荐使用ThreadPoolExecutor来创建
先看ThreadPoolExecutor源码
构造器提供了的参数我们来分析一下
阿里推荐我们使用ThreadPoolExecutor来创建线程池,原因是这样创建线程比较灵活,可以根据自己的业务去定制线程池
ThreadPoolExecutor源码这里就先不讲解放到下篇文章讲解,这里说说ThreadPoolExecutor的执行过程,如何触发maximumPoolSize的执行线程启动
上例子:
以上的执行结果我拷贝一定出来分析:
看到执行结果的朋友们都惊呆了,为什么这执行顺序1,2,3执行的一下子跳到54个任务,然后处理完62的任务又执行4以下的任务,接下来的顺序就正常了
原因: 定义线程池是核心为3个线程,所以执行了1-3任务,没问题!到后面线程pool-4-thread-(4-12)都是 maximumPoolSize - 核心线程 = 要创建的临时线程数.这里是 重点 ,这些临时线程是当你工作队列满了的情况才创建出来的, 而工作队列里面的任务是不先处理,而且让工作队列存放不下的任务,直接交给临时线程处理,所以临时线程直接执行了54-62任务,然后处理完之后在去队列里面从头获取任务执行,所以执行完62任务后后面的执行顺序就正常了.运行到了下面,直接任务数到了29381082时,这里我是启动了任务执行处理不来是或工作队列满了时,任务丢弃了,所以存到工作队列任务的数字就是29381082,然后就通过线程去获取任务指定任务