为什么要使用线程池呢?
举个例子吧,比如我们每天都要去餐厅吃饭,餐厅的阿姨一直在帮我们收拾,上菜,收盘子洗盘子拖地这些工作,非常辛苦,那么这些阿姨是不是我们提前就找好的,她们每天都在这里工作,如果我们吃一顿饭换一批阿姨,每顿饭是不是都要找人,给她们分任务然后再让她们工作,这样是不是就很费时费力啊,我觉得这个例子就能很好地说明为什么要是用线程池,言归正传,大家都知道创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合很多生存期短的任务的程序的可扩展线程池)。
线程池都有哪些呢?适合在什么地方使用呢?我们一一说明
newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
适用场景:执行很多短期异步的小程序或者负载较轻的服务器。
newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待,表示同一时刻只能有这么大的并发数。
适用场景:执行长期的任务,性能好很多
newScheduledThreadPool:创建一个定时线程池,支持定时及周期性任务执行。
适用场景:在给定延迟后运行命令或者定期地执行任务的场景。
newSingleThreadExecutor:创建一个使用单个工作线程的线程池,以无界队列方式来运行该线程。(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执行后续的任务)。可保证顺序(FIFO,LIFO,优先级)地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。与其他等效的newFixedThreadPool(1)不同,可保证无需重新配置此方法所返回的执行程序即可使用其他的线程。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)