java线程池的分类以及各自优缺点
线程池的用处
服务器端处理客户端请求的方式有哪些?1.如果一个请求过来,那么直接给它分配一个新的Thread处理它的请求,2.单线程进行处理
对比上面两种方式,我们会发现两种方式都是不靠谱的。对于第一种方式,如果并发量很高的情况很容易将服务器压垮,另外线程过多,受限于cpu核数的限制,会导致大量的线程切换。2.会导致请求处理过慢。
我们能够想到的解决方案有哪些?定义线程数组,然后线程处理完请求后,不回收线程,这样就会节省了很多时间。
自己开发线程池需要考虑的问题太多,例如死锁、内存泄漏等问题,幸好jdk已经帮我们实现了一些基础的线程池,已经足够我们实现我们的基本功能。
线程池的分类
- newFixedThreadPool:定义一个长度恒定的线程池,线程的数量是恒定的,即使没有任务提交,也不会回收线程。这样的好处就是缩减了新建线程和回收线程所需要的时间,缺点就是如果长时间没有任务,还是会有线程在内存中。
- newCachedThreadPool:定义一个可以可以缓存的线程池,并且可以动态扩展,当新的任务提交的时候,如果没有空闲的线程,那么就创建新的线程执行它。如果没有任务提交的话,空闲的线程就会被回收回收。
- newSingleThreadExecutor:只有一个执行线程的线程池,如果该线程挂掉了,那么会有一个新的线程替代它。优点是可以保证任务的顺序执行,缺点是太慢。
- newScheduleThreadPool:长度恒定的带有定时任务的线程池,允许定时任务的提交以及重复任务的提交。