线程池 executor 和 executors
2018-06-18 03:29:19来源:未知 阅读 ()
Executor是Java线程池的顶级接口
接口中最核心的一个类:ThreadPoolExecutor 中的构造方法:
public ThreadPoolExecutor(int corePoolSize, // 10
int maximumPoolSize, // 10
long keepAliveTime, // 0L
TimeUnit unit, // 时间单位
BlockingQueue<Runnable> workQueue // 队列)
第一个参数:corePoolSize
- 池中所保存的线程数,包括空闲线程。 表示这个线程池一旦初始后,就存在了多少个线程。
第二个参数:maximumPoolSize
- 池中允许的最大线程数。当前这个线程池最大线程数。
第三个参数:keepAliveTime
- 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。当前线程空闲时间是多少,比如为0L,表示这个线程一旦执行完,直接回收,不做停留,不做任何空闲
第四个参数:unit
- keepAliveTime 参数的时间单位。第三个参数与第四个参数是一起用的
第五个参数:workQueue
- 执行前用于保持任务的队列。此队列仅保持由 execute 方法提交的 Runnable 任务。 如果没有空闲线程,任务将被暂缓到这个队列里面。
Executors是类,提供了一系列工厂方法用于创建线程池,返回的线程池都实现了ExecutorService接口。
Executors几个重要方法:
callable(Runnable task): 将 Runnable 的任务转化成 Callable 的任务
newSingleThreadExecutor(): 产生一个ExecutorService对象,这个对象只有一个线程可用来执行任务,若任务多于一个,任务将按先后顺序执行。
newCachedThreadPool(): 产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用。
newFixedThreadPool(int poolSize): 产生一个ExecutorService对象,这个对象带有一个大小为 poolSize 的线程池,若任务数量大于 poolSize ,任务会被放在一个 queue 里顺序执行。
newSingleThreadScheduledExecutor(): 产生一个ScheduledExecutorService对象,这个对象的线程池大小为 1 ,若任务多于一个,任务将按先后顺序执行。
newScheduledThreadPool(int poolSize): 产生一个ScheduledExecutorService对象,这个对象的线程池大小为 poolSize ,若任务数量大于 poolSize ,任务会在一个 queue 里等待执行。
1,Executors.newFixedThreadPool(int nThreads) // 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。
外界传一个参数比如 10, 那么初始化10个线程,并且最大线程数量也是10,如果没有空余线程执任务时,任务将暂缓到这个无界队列中。
2,newCachedThreadPool() //创建一个可根据实际情况调整线程个数的线程池,不限制最大线程数量,如果来了一个任务,就创建一个线程,若无任务则不创建线程,并且每个线程会在60秒后自动回收
第一个参数,coreSize 为0,表示这个线程初始化时,是不创建线程的。开始是没有任何线程的
第二个参数, 表示 可以装多少个线程,Integer.MAX_VALUE 不限定多少个线程
第三,四个参数,表示60秒,比如一个任务执行完成后,该线程不立即回收,等待60秒后,看是否有第二个任务,如果有继续执行,如果没有,就回收。所以这边叫做CachedThreadPool。带有缓存的意思。
synchronousQueue<Runnable>()
3, Executors.newScheduledThreadPool(int corePoolSize) 创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行
具体用法: 一个小例子
import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; class Temp extends Thread { public void run() { System.out.println("run"); } } public class ScheduledJob { public static void main(String args[]) throws Exception { Temp command = new Temp(); ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); // command代表一个任务,5 代表 初始化时延迟5秒执行这个任务,1代表 每隔1 秒轮询着执行这个任务,最后是时间单位,这里是秒 ScheduledFuture<?> scheduleTask = scheduler.scheduleWithFixedDelay(command, 5, 1, TimeUnit.SECONDS); } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:NIO笔记---上
- 最详细的java多线程教程来了 2020-06-08
- 系统化学习多线程(一) 2020-06-08
- 多线程:生产者消费者(管程法、信号灯法) 2020-06-01
- 如何合理地估算线程池大小? 2020-05-31
- 那些面试官必问的JAVA多线程和并发面试题及回答 2020-05-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash