Java线程3-线程池框架

1,线程池

1)Executors框架,静态工厂方法,返回常用的ExecutorService。
2)任务是提交给线程池的,由线程池选择一个idle的线程执行task。
3)线程池+future,并发请求,获取结果。

ExecutorService exc = Executors.newFixedThreadPool(3);
        List> futures = new ArrayList<>();
        for(Runnable runnable : taskList){
            futures.add(exc.submit(myRunnable));
        }
        for (Future future : futures) {
            JSONObject json= future.get();
            //...
        }

2,常用的ExecutorService

1)固定大小的线程池,使用无界队列。
corePoolSize=maximumPoolSize, DefaultThreadFactory和AbortPolicy拒绝策略
优点:无界队列,所以保证所有任务都能入队。
缺点:无界队列,任务过多,有可能导致OOM。

Java线程3-线程池框架_第1张图片
image.png

2)单线程的线程池,使用无界队列。
corePoolSize=maximunPoolSize=1
优点:单线程 顺序执行任务,当异常导致线程终止时,会在创建一个新的线程来执行。
缺点:无界队列, 任务过多,有可能导致OOM。
Java线程3-线程池框架_第2张图片
image.png

3)线程个数无线大的线程池。任务队列长度为1 corePoolSize=0,maximumPoolSize=无限大
SynchronousQueue: 只有1个元素的队列,入队的任务需要一直阻塞直到队列中的元素被移出。
优点: 提交一个任务会立即分配一个线程来执行,线程idle的时间为60s。
缺点: 任务执行时间过长时,会创建比较多的线程。
Java线程3-线程池框架_第3张图片
image.png

4)对比
Java线程3-线程池框架_第4张图片
image.png

3,定时任务线程池

1)实现了ScheduledExecutorService接口,除了有线程池的功能,还有定时和周期性执行任务的功能
schedule方法:delay指定时间后,返回ScheduledFuture。
scheduleWithFixedDelay方法:initialDelay 指定延迟后,按指定的 delay,延期性的执行Runnable。
scheduleAtFixedRate方法:initialDelay指定延迟后,按period周期性的执行Runnable。

Java线程3-线程池框架_第5张图片
image.png

Java线程3-线程池框架_第6张图片
image.png

2)ScheduledFuture继承了Future和Delayed。
判断定时任务是否已经完成,获得定时任务的返回值,或者取消任务等
image.png

获取定时任务剩余的delay时间
Java线程3-线程池框架_第7张图片
image.png

Java线程3-线程池框架_第8张图片
image.png

3)创建定时任务线程池
image.png

Java线程3-线程池框架_第9张图片
image.png

4)ScheduledThreadPoolExecutor构造。 通过使用DelayedWorkQueue来执行定时任务
Java线程3-线程池框架_第10张图片
image.png

Java线程3-线程池框架_第11张图片
image.png

5)eg例子
//延迟1s,每隔3s执行一次task。 每个定时任务在 ScheduledThreadPoolExecutor 中,都是串行运行的,即下一次运行任务一定在上一次任务结束之后。
scheduledPool.scheduleAtFixedRate(task, 1000, 3000, TimeUnit.MILLISECONDS);
//延迟1s,当一个任务完成后,delay 3s执行task。
scheduledPool.scheduleWithFixedDelay(task, 1000, 3000, TimeUnit.MILLISECONDS);

4,定时任务线程池实现原理

1)scheduleAtFixedRate执行流程

Java线程3-线程池框架_第12张图片
image.png

Java线程3-线程池框架_第13张图片
image.png

Java线程3-线程池框架_第14张图片
image.png

2)ScheduledFutureTask的run方法实现
setNextRunTime:对于fixedRate和fixedDelay类型的任务都是在这个时间点才设置的
Java线程3-线程池框架_第15张图片
image.png

再次将任务加入队列
Java线程3-线程池框架_第16张图片
image.png

你可能感兴趣的:(Java线程3-线程池框架)