java线程池的原理是什么?在什么地方需要线程池

2021-02-20 17:38发布

11条回答

为什么要使用线程池呢?

举个例子吧,比如我们每天都要去餐厅吃饭,餐厅的阿姨一直在帮我们收拾,上菜,收盘子洗盘子拖地这些工作,非常辛苦,那么这些阿姨是不是我们提前就找好的,她们每天都在这里工作,如果我们吃一顿饭换一批阿姨,每顿饭是不是都要找人,给她们分任务然后再让她们工作,这样是不是就很费时费力啊,我觉得这个例子就能很好地说明为什么要是用线程池,言归正传,大家都知道创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动 的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。 从JDK1.5开始,Java API 提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池 (一个适合很多生存期短的任务的程序的可扩展线程池)。

线程池都有哪些呢?适合在什么地方使用呢?我们一一说明

newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
适用场景:执行很多短期异步的小程序或者负载较轻的服务器。

newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待,表示同一时刻只能有这么大的并发数。
适用场景:执行长期的任务,性能好很多

newScheduledThreadPool:创建一个定时线程池,支持定时及周期性任务执行。
适用场景:在给定延迟后运行命令或者定期地执行任务的场景。

newSingleThreadExecutor:创建一个使用单个工作线程的线程池,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序(FIFO, LIFO, 优先级)地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的 newFixedThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
适用场景:按序且逐个执行任务的场景

以上就是我对线程池的理解啦。这部分知识还是特别重要的,一定要多学多练。加油啊少年!

一周热门 更多>