- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
public interface ScheduledExecutorService extends ExecutorService
1、 一个ExecutorService,可安排在给定的延迟后运行或定期执行的命令;
2、 schedule方法使用各种延迟创建任务,并返回一个可用于取消或检查执行的任务对象;
3、 scheduleAtFixedRate和scheduleWithFixedDelay方法创建并执行某些在取消前一直定期运行的任务;
4、 用Executor.execute(java.lang.Runnable)和ExecutorService的submit方法所提交的命令,通过所请求的0延迟进行安排schedule方法中允许出现0和负数延迟(但不是周期),并将这些视为一种立即执行的请求;
<?>
schedule(Runnable command, long delay, TimeUnit unit)创建并执行在给定延迟后启用的 ScheduledFuture。
创建并执行在给定延迟后启用的一次性操作。
<?>
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)创建并执行一个在给定初始延迟后首次启用的定期操作,后续操作具有给定的周期;也就是将在 initialDelay 后开始执行,然后在 initialDelay+period 后执行,接着在 initialDelay + 2 * period 后执行,依此类推。
<?>
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)创建并执行一个在给定初始延迟后首次启用的定期操作,随后,在每一次执行终止和下一次执行开始之间都存在给定的延迟。
public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor implements ScheduledExecutorService
1、 可另行安排在给定的延迟后运行命令,或者定期执行命令;
2、 需要多个辅助线程时,或者要求ThreadPoolExecutor具有额外的灵活性或功能时,此类要优于Timer;
3、 一旦启用已延迟的任务就执行它,但是有关何时启用,启用后何时执行则没有任何实时保证按照提交的先进先出(FIFO)顺序来启用那些被安排在同一执行时间的任务;
4、 此类重写AbstractExecutorService的submit方法,以生成内部对象控制每个任务的延迟和调度;
ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler)
可以自定义corePoolSize、threadFactory、handler。
corePoolSize - 池中所保存的线程数(包括空闲线程)
threadFactory - 执行程序创建新线程时使用的工厂,默认DefaultThreadFactory。
handler - 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序,默认ThreadPoolExecutor.AbortPolicy。
ScheduledThreadPoolExecutor较ThreadPoolExecutor队列的区别是:前者只能使用DelayedWorkQueue,后者可自定义BlockingQueue。
提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。
// Override AbstractExecutorService methods
public Future<?> submit(Runnable task) {
return schedule(task, 0, TimeUnit.NANOSECONDS);
}
public <T> Future<T> submit(Runnable task, T result) {
return schedule(Executors.callable(task, result),
0, TimeUnit.NANOSECONDS);
}
public <T> Future<T> submit(Callable<T> task) {
return schedule(task, 0, TimeUnit.NANOSECONDS);
}
使用所要求的零延迟执行命令。
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
schedule(command, 0, TimeUnit.NANOSECONDS);
}
从源码看出,submit和execute方法均由schedule(task, 0, TimeUnit.NANOSECONDS)来实现。
在以前已提交任务的执行中发起一个有序的关闭,但是不接受新任务。
public void shutdown() {
cancelUnwantedTasks();
super.shutdown();
}
/**
* Cancels and clears the queue of all tasks that should not be run
* due to shutdown policy.
*/
private void cancelUnwantedTasks() {
boolean keepDelayed = getExecuteExistingDelayedTasksAfterShutdownPolicy();
boolean keepPeriodic = getContinueExistingPeriodicTasksAfterShutdownPolicy();
if (!keepDelayed && !keepPeriodic)
super.getQueue().clear();
else if (keepDelayed || keepPeriodic) {
Object[] entries = super.getQueue().toArray();
for (int i = 0; i < entries.length; ++i) {
Object e = entries[i];
if (e instanceof RunnableScheduledFuture) {
RunnableScheduledFuture<?> t = (RunnableScheduledFuture<?>)e;
if (t.isPeriodic()? !keepPeriodic : !keepDelayed)
t.cancel(false);
}
}
entries = null;
purge();
}
}
由源码看出,取消线程是利用Future.cancel特性,shutdown是调用的父类ThreadPoolExecutor.shutdown方法。
尝试停止所有正在执行的任务、暂停等待任务的处理,并返回等待执行的任务列表。
public List<Runnable> shutdownNow() {
return super.shutdownNow();//ThreadPoolExecutor.shutdownNow
}
<?>
schedule(Runnable command, long delay, TimeUnit unit)public ScheduledFuture<?> schedule(Runnable command,
long delay,
TimeUnit unit) {
if (command == null || unit == null)
throw new NullPointerException();
RunnableScheduledFuture<?> t = decorateTask(command,
new ScheduledFutureTask<Void>(command, null,
triggerTime(delay, unit)));
delayedExecute(t);
return t;
}
schedule(Callable callable, long delay, TimeUnit unit)与其实现基本相同。
声明RunnableScheduledFuture由其内部类ScheduledFutureTask实现。
延迟执行的核心实现
private void delayedExecute(Runnable command) {
if (isShutdown()) {
reject(command);//线程已关闭
return;
}
if (getPoolSize() < getCorePoolSize())//运行的线程小于核心线程,开启新的线程
prestartCoreThread();
super.getQueue().add(command);
}
DelayedWorkQueue是ScheduledThreadPoolExecutor内部类,队列的核心基于无界阻塞队列DelayQueue实现。
private static class DelayedWorkQueue extends AbstractCollection<Runnable> implements BlockingQueue<Runnable> {
private final DelayQueue<RunnableScheduledFuture> dq = new DelayQueue<RunnableScheduledFuture>();
}
给定初始延迟后首次启用的定期操作后,以initialDelay + N * period固定周期执行任务(N>=0)。
给定初始延迟后首次启用的定期操作后,每一次执行终止和下一次执行开始之间都存在给定的延迟delay。
通俗地理解scheduleAtFixedRate到了时间就自动执行,scheduleWithFixedDelay是每一次任务执行完成后,延迟delay时间,再执行一个任务。
第一种情况若任务执行时间长,任务有可能并行,而第二种只能串行。
ScheduledThreadPoolExecutor继承ThreadPoolExecutor,只用了核心线程池,其任务队列是采用了内部类DelayedWorkQueue实现, 任务实体由内部类ScheduledFutureTask实现,其实现compareTo方法,达到内部自然排序,具有延迟或定期执行任务的特性。
ScheduledThreadPoolExecutor 扩展自 一文秒懂 Java 线程池之 ThreadPoolExecutor 讲解的 了ThreadPoolExecutor 类,并且添加了其它方
ThreadPoolExecutor 和 ScheduledThreadPoolExecutor 是线程安全的吗?现在,我有一个场景如下: 5 ThreadPoolExecutor(s) exec1(
我有以下类(class) public class MaintanceTools { public static final ScheduledThreadPoolExecutor THREA
我需要更改 ScheduledThreadPoolExecutor 的运行任务的执行时间。 我有类似的东西 executor.schedule(new Runnable() {blablal},10,
我想要一些线程池,它每隔固定的时间运行一些任务(这个线程池一直在获取任务)。每个任务都会调用一些 API 来获取一些值,该值可以为 null。我希望仅当返回值为空时任务才再次运行(在固定时间后)。否则
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含有效代码以重现该问题。请参阅SSCCE.o
我有一个具有固定延迟的任务,并且希望在 ScheduledThreadPoolExecutor 队列中只有一个任务。我的想法是使用 getQueue().isEmpty() 来检查队列中是否只有一个任
我如何将参数传递给 ScheduledThreadPoolExecutor? 我有以下代码。您会注意到,我声明了一个变量“num”,并将其作为参数传递给 exampleFunction()。 exam
假设我有这样的方法 public void scheduleCleanup(String parameter) { final SomeObject someObject = new Some
我知道由于各种原因我必须使用它而不是 java.util.Timer。所以,为了研究这个,我正在查看文档,我有几个问题: scheduleWithFixedDelay() 是如何工作的? 我的理解是:
例程 myProcessToRun() 需要执行 100 次,但每次执行之间需要大约一秒钟的延迟。 以下 FOR 循环与 ScheduledThreadPoolExecutor 对象结合使用。 for
ScheduledThreadPoolExecutor 中有两个属性具有以下 getter(以及随附的 setter) : boolean getContinueExistingPeriodicTas
这个问题只是为了对这些概念有一些想法,以了解业内人士将其用于什么目的。 如果您可以仅给出一些示例用法,我将不胜感激。我知道它们是如何工作的,并确实阅读了有关它们的google文档,但我似乎仍然很难选择
所有可用的 ScheduledThreadPoolExecutor 构造函数都需要一个 corePoolsize 参数。但我不确定我实际需要多少? 我计划在一个类中使用它,其中一个实例仅使用 1 个计
我正在尝试在 scala play 框架中实现预定作业。 以下是我的代码: def subCron = { val task = new Runnable { def run() = {
ScheduledThreadPoolExecutor 的文档说 -安排在完全相同执行时间的任务以先进先出 (FIFO) 的提交顺序启用。 这是否意味着应该同时完成的任务永远不会同时完成。相反,它们以
我有这个简单的代码片段: /** * @param args the command line arguments */ public static void main(String[] args
我写了下面的代码: import java.util.Calendar; import java.util.concurrent.ScheduledThreadPoolExecutor; import
如果我使用ThreadPoolExecutor,我有多种构造函数,我可以为池的工作队列传递/使用我自己的队列。 现在我看到 ScheduledThreadPoolExecutor 是 ThreadPo
我正在阅读 ScheduledThreadPoolExecutor JavaDoc并遇到了以下事情: Delayed tasks execute no sooner than they are ena
我是一名优秀的程序员,十分优秀!