- 浏览: 985047 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
ScheduledThreadPoolExecutor解析一(调度任务,任务队列):
http://donald-draper.iteye.com/blog/2367332
ScheduledThreadPoolExecutor解析二(任务调度):
http://donald-draper.iteye.com/blog/2367593
前面一篇文章,我们看了任务的调度,先回顾一下:
从调度线程池执行器的构造来看,核心线程池数量是必须设置的,线程工厂和拒绝策略可选,默认最大线程池数量为 Integer.MAX_VALUE,保活时间为0,即不存在空闲的任务线程,
任务队列为DelayedWorkQueue。
scheduleAtFixedRate方法首先根据任务command和任务执行系统时间,
及任务间隔时间period,构造调度任务,简单包装调度任务,延时执行调度任务,
延时执行调度任务。在延时执行调度任务时,
添加任务到延时DelayedWorkQueue,同时添加一个空任务工作线程,空任务工作线程执行时,
如果任务为null,则从任务队列中取任务。调度任务的执行,如果任务为ScheduledFutureTask,
在运行的时候,从新计算任务下一次执行的系统时间,重置任务线程状态为READY,添加任务到队列。
scheduleWithFixedDelay与scheduleAtFixedRate不同点在构造ScheduledFutureTask时间间隔为-delay。时间间隔p为正,以固定的频率调度任务即scheduleAtFixedRate,每隔p时间执行一次任务,无论上一次任务是否执行完,具体任务能否执行,调度线程池无法保证,这要看是否有工作线程可用;当时间间隔p为负,以固定的间隔时间调度任务,即scheduleWithFixedDelay,
当前任务执行完后,等待p时间,再执行下一个任务。
今天来看一下线程池的关闭。
//ThreadPoolExecutor
关键在这一点
//线程池关闭hook
关闭操作,与线程池执行器的关闭基本相同,不同的是,在onShutdown方法,调度线程池执行器,重写了这个方法,这个方法主要是根据线程池关闭间歇性任务和延时任务的处理策略,确定是否以不可中断方式取消任务。
再来看立即关闭:
总结:
关闭操作,与线程池执行器的关闭基本相同,不同的是,在onShutdown方法,调度线程池执行器,重写了这个方法,这个方法主要是根据线程池关闭间歇性任务和延时任务的处理策略,确定是否以不可中断方式取消任务。
http://donald-draper.iteye.com/blog/2367332
ScheduledThreadPoolExecutor解析二(任务调度):
http://donald-draper.iteye.com/blog/2367593
前面一篇文章,我们看了任务的调度,先回顾一下:
从调度线程池执行器的构造来看,核心线程池数量是必须设置的,线程工厂和拒绝策略可选,默认最大线程池数量为 Integer.MAX_VALUE,保活时间为0,即不存在空闲的任务线程,
任务队列为DelayedWorkQueue。
scheduleAtFixedRate方法首先根据任务command和任务执行系统时间,
及任务间隔时间period,构造调度任务,简单包装调度任务,延时执行调度任务,
延时执行调度任务。在延时执行调度任务时,
添加任务到延时DelayedWorkQueue,同时添加一个空任务工作线程,空任务工作线程执行时,
如果任务为null,则从任务队列中取任务。调度任务的执行,如果任务为ScheduledFutureTask,
在运行的时候,从新计算任务下一次执行的系统时间,重置任务线程状态为READY,添加任务到队列。
scheduleWithFixedDelay与scheduleAtFixedRate不同点在构造ScheduledFutureTask时间间隔为-delay。时间间隔p为正,以固定的频率调度任务即scheduleAtFixedRate,每隔p时间执行一次任务,无论上一次任务是否执行完,具体任务能否执行,调度线程池无法保证,这要看是否有工作线程可用;当时间间隔p为负,以固定的间隔时间调度任务,即scheduleWithFixedDelay,
当前任务执行完后,等待p时间,再执行下一个任务。
今天来看一下线程池的关闭。
public void shutdown() { //委托给父类线程池执行器 super.shutdown(); }
//ThreadPoolExecutor
public void shutdown() { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { //检查线程访问权限 checkShutdownAccess(); //更新线程池状态为SHUTDOWN advanceRunState(SHUTDOWN); //中断空闲工作线程 interruptIdleWorkers(); //线程池关闭hook onShutdown(); // hook for ScheduledThreadPoolExecutor } finally { mainLock.unlock(); } //尝试结束线程池,这个前面以说,这里不再说 tryTerminate(); }
关键在这一点
//线程池关闭hook
onShutdown(); // hook for ScheduledThreadPoolExecutor
/** * Cancels and clears the queue of all tasks that should not be run * due to shutdown policy. Invoked within super.shutdown. */ @Override void onShutdown() { //获取任务队列 BlockingQueue<Runnable> q = super.getQueue(); boolean keepDelayed = getExecuteExistingDelayedTasksAfterShutdownPolicy(); boolean keepPeriodic = getContinueExistingPeriodicTasksAfterShutdownPolicy(); if (!keepDelayed && !keepPeriodic) { //如果在线程池关闭时,可以在任务执行时,取消间歇性任务和延时任务, //则遍历任务,并以不可中断方式取消任务。 for (Object e : q.toArray()) if (e instanceof RunnableScheduledFuture<?>) ((RunnableScheduledFuture<?>) e).cancel(false); q.clear(); } else { // Traverse snapshot to avoid iterator exceptions //否则,遍历任务根据是间歇性任务还是延时任务, //获取相应的线程池关闭是否可取消正在执行的任务的策略 for (Object e : q.toArray()) { if (e instanceof RunnableScheduledFuture) { RunnableScheduledFuture<?> t = (RunnableScheduledFuture<?>)e; if ((t.isPeriodic() ? !keepPeriodic : !keepDelayed) || t.isCancelled()) { // also remove if already cancelled 如果可取消或任务已经取消,则移除任务,成功,则以不可中断方式取消任务。 if (q.remove(t)) t.cancel(false); } } } } //这个在线程池相关的文章中以说,这里不再说,尝试关闭线程池 tryTerminate(); }
关闭操作,与线程池执行器的关闭基本相同,不同的是,在onShutdown方法,调度线程池执行器,重写了这个方法,这个方法主要是根据线程池关闭间歇性任务和延时任务的处理策略,确定是否以不可中断方式取消任务。
再来看立即关闭:
public List<Runnable> shutdownNow() { //委托给父类 return super.shutdownNow(); }
//执行Runnable任务 public void execute(Runnable command) { schedule(command, 0, TimeUnit.NANOSECONDS); } //提交Runnable任务 // Override AbstractExecutorService methods /** * @throws RejectedExecutionException {@inheritDoc} * @throws NullPointerException {@inheritDoc} */ public Future<?> submit(Runnable task) { return schedule(task, 0, TimeUnit.NANOSECONDS); } /** * @throws RejectedExecutionException {@inheritDoc} * @throws NullPointerException {@inheritDoc} */ public <T> Future<T> submit(Runnable task, T result) { return schedule(Executors.callable(task, result), 0, TimeUnit.NANOSECONDS); } /** * @throws RejectedExecutionException {@inheritDoc} * @throws NullPointerException {@inheritDoc} */ public <T> Future<T> submit(Callable<T> task) { return schedule(task, 0, TimeUnit.NANOSECONDS); } //设置线程池关闭延时任务处理策略 /** * Sets the policy on whether to execute existing delayed * tasks even when this executor has been {@code shutdown}. * In this case, these tasks will only terminate upon * {@code shutdownNow}, or after setting the policy to * {@code false} when already shutdown. * This value is by default {@code true}. * * @param value if {@code true}, execute after shutdown, else don't. * @see #getExecuteExistingDelayedTasksAfterShutdownPolicy */ public void setExecuteExistingDelayedTasksAfterShutdownPolicy(boolean value) { executeExistingDelayedTasksAfterShutdown = value; if (!value && isShutdown()) //如果在线程池关闭时,可以取消延时任务 onShutdown(); } //设置线程池关闭间歇性任务处理策略 /** * Sets the policy on whether to continue executing existing * periodic tasks even when this executor has been {@code shutdown}. * In this case, these tasks will only terminate upon * {@code shutdownNow} or after setting the policy to * {@code false} when already shutdown. * This value is by default {@code false}. * * @param value if {@code true}, continue after shutdown, else don't. * @see #getContinueExistingPeriodicTasksAfterShutdownPolicy */ public void setContinueExistingPeriodicTasksAfterShutdownPolicy(boolean value) { continueExistingPeriodicTasksAfterShutdown = value; if (!value && isShutdown()) //如果在线程池关闭时,可以取消间歇性任务 onShutdown(); }
总结:
关闭操作,与线程池执行器的关闭基本相同,不同的是,在onShutdown方法,调度线程池执行器,重写了这个方法,这个方法主要是根据线程池关闭间歇性任务和延时任务的处理策略,确定是否以不可中断方式取消任务。
发表评论
-
Executors解析
2017-04-07 14:38 1256ThreadPoolExecutor解析一(核心线程池数量、线 ... -
ScheduledThreadPoolExecutor解析二(任务调度)
2017-04-06 12:56 2128ScheduledThreadPoolExecutor解析一( ... -
ScheduledThreadPoolExecutor解析一(调度任务,任务队列)
2017-04-04 22:59 4992Executor接口的定义:http://donald-dra ... -
ThreadPoolExecutor解析四(线程池关闭)
2017-04-03 23:02 9113Executor接口的定义:http: ... -
ThreadPoolExecutor解析三(线程池执行提交任务)
2017-04-03 12:06 6088Executor接口的定义:http://donald-dra ... -
ThreadPoolExecutor解析二(线程工厂、工作线程,拒绝策略等)
2017-04-01 17:12 3042Executor接口的定义:http://donald-dra ... -
ThreadPoolExecutor解析一(核心线程池数量、线程池状态等)
2017-03-31 22:01 20523Executor接口的定义:http://donald-dra ... -
ScheduledExecutorService接口定义
2017-03-29 12:53 1511Executor接口的定义:http://donald-dra ... -
AbstractExecutorService解析
2017-03-29 08:27 1081Executor接口的定义:http: ... -
ExecutorCompletionService解析
2017-03-28 14:27 1596Executor接口的定义:http://donald-dra ... -
CompletionService接口定义
2017-03-28 12:39 1069Executor接口的定义:http://donald-dra ... -
FutureTask解析
2017-03-27 12:59 1330package java.util.concurrent; ... -
Future接口定义
2017-03-26 09:40 1198/* * Written by Doug Lea with ... -
ExecutorService接口定义
2017-03-25 22:14 1164Executor接口的定义:http://donald-dra ... -
Executor接口的定义
2017-03-24 23:24 1678package java.util.concurrent; ... -
简单测试线程池拒绝执行任务策略
2017-03-24 22:37 2031线程池多余任务的拒绝执行策略有四中,分别是直接丢弃任务Disc ... -
JAVA集合类简单综述
2017-03-23 22:51 925Queue接口定义:http://donald-draper. ... -
DelayQueue解析
2017-03-23 11:00 1738Queue接口定义:http://donald-draper. ... -
SynchronousQueue解析下-TransferQueue
2017-03-22 22:20 2140Queue接口定义:http://donald-draper. ... -
SynchronousQueue解析上-TransferStack
2017-03-21 22:08 3061Queue接口定义:http://donald-draper. ...
相关推荐
源码解析文件ScheduledThreadPoolExecutor 在 Java 中,ScheduledThreadPoolExecutor 是一个线程池执行器,用于执行延迟任务。它使用DelayedWorkQueue来实现延迟的效果。下面是 ScheduledThreadPoolExecutor 的实现...
关闭线程池可以通过`shutdown()`或`shutdownNow()`方法,前者等待所有已提交任务完成后关闭,后者尝试停止正在执行的任务并关闭线程池。 6. 合理配置线程池 配置线程池时需考虑系统资源、任务特性等因素。对于IO...
#### 三、线程池的工作原理 线程池的基本思想是预先创建一组线程并将其放入池中,当有新的任务到来时,可以从池中取出一个空闲的线程来处理这个任务。具体来说: - **线程池创建和初始化**:在启动时,根据预设的...
如单线程池(newSingleThreadExecutor)、定长线程池(newFixedThreadPool)、缓存线程池(newCachedThreadPool)和定时线程池(ScheduledThreadPoolExecutor)等,它们分别对应不同的应用场景。 1. **单线程池**:...
计划线程池可以使用 ScheduledThreadPoolExecutor 类来创建。 结论 JDK 自带线程池是 Java 语言中非常有用的工具,可以提高多线程编程的效率和灵活性。通过本文的介绍,我们可以了解 JDK 自带线程池的组成、创建...
三、线程池的参数 ThreadPoolExecutor的构造函数接收以下五个参数: 1. corePoolSize:核心线程数,即使空闲也会保留。 2. maximumPoolSize:最大线程数,超过这个数量的任务会被放入任务队列。 3. keepAliveTime:...
6. 定时任务支持:添加定时任务功能,通过`ScheduledThreadPoolExecutor`实现周期性或延迟执行的任务。 封装线程池时,建议创建一个工具类或单例模式的类,提供简单的接口供其他组件调用,如`execute(Runnable task...
在Java中,`java.util.concurrent`包提供了线程池相关的接口和类,如ExecutorService、ThreadPoolExecutor和ScheduledThreadPoolExecutor。ExecutorService是线程池的基本服务接口,ThreadPoolExecutor是其具体实现...
- ScheduledThreadPoolExecutor:可定时或周期性执行任务的线程池,适用于需要定时执行任务的场合。 了解以上知识点,能够帮助后端开发者更好地掌握Java线程池,应对面试中的相关问题,并在实际开发中更有效地使用...
3. **ScheduledThreadPoolExecutor**:支持定时及周期性任务执行。 ```java ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); ``` 4. **SingleThreadExecutor**:创建一...
Java定时器线程池,即`ScheduledThreadPoolExecutor`,是Java并发编程中一个重要的工具,它继承自`ThreadPoolExecutor`并扩展了定时和周期性任务的执行能力。`ScheduledThreadPoolExecutor`提供了定时执行、延迟执行...
3. 使用`shutdown()`和`awaitTermination()`优雅地关闭线程池:在应用退出时,确保正确关闭线程池,避免内存泄漏和资源占用。 总结,`Android Executor`线程池提供了强大的并发任务处理能力,通过合理配置和使用,...
本篇学习笔记将深入解析Java线程池的框架、结构、原理以及相关源码,帮助读者全面理解线程池的工作机制。 1. 线程池模块结构 线程池框架分为多层结构,其中包括核心实现类、辅助类和接口等组件。例如,`sun.nio.ch....
#### 三、线程池工作原理 线程池的基本工作流程包括以下步骤: 1. **初始化**:创建一个线程池,并设置核心线程数、最大线程数、空闲线程存活时间等参数。 2. **提交任务**:通过`execute()`方法提交任务到线程池...
除了上述三种线程池外,Java还提供了用于执行定时任务的线程池,即`ScheduledThreadPoolExecutor`。 ##### 1. `newScheduledThreadPool` - **定义**:通过`Executors`工具类创建的定时任务线程池。 - **特点**: ...
线程池的引入始于JDK 1.5,它引入了`java.util.concurrent`包,提供了`Executor`、`ExecutorService`和相关的实现类,如`ThreadPoolExecutor`和`ScheduledThreadPoolExecutor`。 线程池的主要作用是限制系统中同时...
本篇将详细介绍安卓线程池的四种使用方法,并结合具体源码进行解析。 一、ThreadPoolExecutor的创建与使用 ThreadPoolExecutor是Java中的线程池实现类,同样适用于安卓开发。通过指定核心线程数、最大线程数、线程...
ExecutorService 是 Java.util.concurrent 包中的一个接口,它是 Executor 接口的子接口,提供了更丰富的线程管理功能,如提交任务并获取结果、关闭线程池等。 2. **基础线程池**: - **ThreadPoolExecutor**:这...
线程池的实现通常包括三个主要的类:ThreadPoolExecutor、ScheduledThreadPoolExecutor和FutureTask。 ThreadPoolExecutor类是线程池的核心类,它提供了大量的可配置参数,允许我们对线程池进行灵活配置。例如,...
- `ScheduledThreadPoolExecutor`:扩展 `ThreadPoolExecutor`,支持定时任务执行。 - **主要配置参数**: - `corePoolSize`:线程池的基本大小。 - `maximumPoolSize`:线程池最大允许的大小。 - `...