Excutor(接口)
线程池执行器,只有一个方法excute(Runable command)
ExcutorService
继承了Excutor,并且拓展了线程池的生命周期`(shutdown结束方法,submit(Runable task T result )isShutDown等方法)
Callable
call()方法,有返回值并且可抛出异常
Future
存储将来线程执行的结果
get()方法,可获取线程池submit()方法的返回值,且是阻塞的
FutureTask
即实现了Future又实现了Task
CompletableFure
管理多个Future的结果,可以等待多个线程或某个方法同时执行完成
CompletableFure.allOf(completableFure1,completableFure2,completableFure3).join();多个线程都完成
CompletableFure.supplyAsync()
ThreadPoolExcutor
手动定义线程池ThreadPoolExcutor(corePoolSize,maximumPoolSize,keepAliveTime,TimeUnit.SECONDS ,new ArrayBlockingQueue<Runnable>(4),Excutors.defaultThreadFactory(),new ThreadPoolExcutor.discardOldestPolicy())
1.corePoolSize:核心线程数;
2.maximumPoolSize:最大线程数;
3.keepAliveTime:空闲时间
4.TimeUnit.SECONDS:时间单位
5.new ArrayBlockingQueue存放任务的队列
6.defaultThreadFactory:产生线程的方式,默认提供defaultThreadFactory
7.new ThreadPoolExcutor.discardOldestPolicy()拒绝策略,默认提供四种(也可自定义)
Excutors
线程池工厂
SingleThreadPool
只有一个线程,可以保证任务的执行顺序
为什么要有一个单线程的线程池?
任务队列 生命周期管理
CacheTreadPool
如果有空闲线程则不启动新线程,否则启动闲的线程,线程最大数为Integer最大数
弊端:不能控制线程数
FixedTreadPoll
固定线程数的线程池(核心线程=最大线程),
ScheduleTreadPool
定时器线程池,使用了DelayedWorkQueue指定间隔时间运行
一般用定时框架代替:quarts cron
WorkStealingPool
每个现场有自己单独的队列,自己的队列执行完了去别的队列拿任务
并行和并发有什么区别
并发指任务提交,不行是指任务执行
并行是并发的子集
ForJoinPool
分解汇总的任务
用很少的线程可以执行很多的任务(子任务)
网友评论