直接上图说明。
首先我们来说说为啥很少使用Thread作为实现多线程的方法呐。
我们明白类的话继承只支持一个。而接口可以继承多个。这就算为啥不使用Thread而用Runable的原因之一了。
其他缺点如下:
a. 每次new Thread新建对象性能差。
b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。
c. 缺乏更多功能,如定时执行、定期执行、线程中断。
相比new Thread,Java提供的四种线程池的好处在于:
a. 重用存在的线程,减少对象创建、消亡的开销,性能佳。
b. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。
c. 提供定时执行、定期执行、单线程、并发数控制等功能。
第二个开始我们正文内容了:
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
newFixedThreadPool(常用)
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
因为线程池大小为固定,可在方法加睡眠停顿查看效果每个任务输出index后sleep 2秒,所以每两秒打印。
定长线程池的大小最好根据系统资源进行设置。
newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。
这个在原想的项目中使用过部分代码
newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
一个一个跑的就是他的顺序。
现在服务器端的应用程序几乎都采用了“线程池”技术,这主要是为了提高系统效率。因为如果服务器对应每一个请求就创建一个线程的话,在很短的一段时间内就会产生很多创建和销毁线程动作,导致服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。线程池就是为了尽量减少这种情况的发生。
若不采用线程池进行管理的话。那线程数量不受控制可能导致服务器宕机了。进行处理最大化的同时兼顾服务器性能。
做好最大的优化才是这中技术的目的性呐。