线程池的理解及使用
Posted 小码仙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池的理解及使用相关的知识,希望对你有一定的参考价值。
原文链接:https://blog.csdn.net/syoung99/article/details/52526475
小仙说明:修正原文部分别字及方法名错误
1、初识线程池
根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程池主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行。
2、线程池作用
减少创建和销毁线程的次数,每个工作线程可以多次使用,可根据系统情况调整执行的线程数量,防止消耗过多内存。
3、使用(小仙部分补充)
ExecutorService:线程池接口
ExecutorService pool = Executors.常见线程池
ScheduledExecutorService:周期性线程池接口
ScheduledExecutorService pool = Executors.常见周期性线程池
eg:
ExecutorService pool = Executors.newSingleThreadExecutor();
ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);
4、常见线程池
① newSingleThreadExecutor
单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务。
② newFixedThreadPool(n)
固定数量的线程池,每提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行。
③ newCacheThreadPool(推荐使用)
可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。
④ newScheduleThreadPool
大小无限制的线程池,支持定时和周期性的执行线程。
5、实例(小仙亲测,非转载)
① newSingleThreadExecutor
核心代码:
ExecutorService pool = Executors.newSingleThreadExecutor();
pool.execute(t1);
执行样例:
可以看到同时只有1个线程(1个线程名)在执行。
② newFixedThreadPool(n)
核心代码:
ExecutorService pool = Executors.newFixedThreadPool(3);
pool.execute(t1);
执行样例:
可以看到,当指定线程池数量为3时,最多同时有3个线程(3个线程名)在线程池中执行,执行完一个,再从排队队列里拿出一个继续执行。
③ newCacheThreadPool
核心代码:
ExecutorService pool = Executors.newCachedThreadPool();
pool.execute(t1);
执行样例:
可以看到,5个线程(5个线程名)都在线程池中执行了,该线程池无限大,灵活智能。
④ newScheduleThreadPool
核心代码:
ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);
pool.schedule(t1, 1, TimeUnit.SECONDS);
执行样例:
可以看到,一秒打印一行日志,线程池固定了3个线程(3个线程名),按照delay时间达到后开始执行,执行完一个即收回,给后面新线程使用。
另外,它还有一个专用于单线程的newSingleThreadScheduledExecutor,使用方法类似:
核心代码:
ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();
pool.schedule(t1, 1, TimeUnit.SECONDS);
执行样例:
(本文结束)
每天成长一小步,一年进步一大步。
——【小码仙】
xmx-code
以上是关于线程池的理解及使用的主要内容,如果未能解决你的问题,请参考以下文章