- 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方法,达到内部自然排序,具有延迟或定期执行任务的特性。
我正在编写一个具有以下签名的 Java 方法。 void Logger(Method method, Object[] args); 如果一个方法(例如 ABC() )调用此方法 Logger,它应该
我是 Java 新手。 我的问题是我的 Java 程序找不到我试图用作的图像文件一个 JButton。 (目前这段代码什么也没做,因为我只是得到了想要的外观第一的)。这是我的主课 代码: packag
好的,今天我在接受采访,我已经编写 Java 代码多年了。采访中说“Java 垃圾收集是一个棘手的问题,我有几个 friend 一直在努力弄清楚。你在这方面做得怎么样?”。她是想骗我吗?还是我的一生都
我的 friend 给了我一个谜语让我解开。它是这样的: There are 100 people. Each one of them, in his turn, does the following
如果我将使用 Java 5 代码的应用程序编译成字节码,生成的 .class 文件是否能够在 Java 1.4 下运行? 如果后者可以工作并且我正在尝试在我的 Java 1.4 应用程序中使用 Jav
有关于why Java doesn't support unsigned types的问题以及一些关于处理无符号类型的问题。我做了一些搜索,似乎 Scala 也不支持无符号数据类型。限制是Java和S
我只是想知道在一个 java 版本中生成的字节码是否可以在其他 java 版本上运行 最佳答案 通常,字节码无需修改即可在 较新 版本的 Java 上运行。它不会在旧版本上运行,除非您使用特殊参数 (
我有一个关于在命令提示符下执行 java 程序的基本问题。 在某些机器上我们需要指定 -cp 。 (类路径)同时执行java程序 (test为java文件名与.class文件存在于同一目录下) jav
我已经阅读 StackOverflow 有一段时间了,现在我才鼓起勇气提出问题。我今年 20 岁,目前在我的家乡(罗马尼亚克卢日-纳波卡)就读 IT 大学。足以介绍:D。 基本上,我有一家提供簿记应用
我有 public JSONObject parseXML(String xml) { JSONObject jsonObject = XML.toJSONObject(xml); r
我已经在 Java 中实现了带有动态类型的简单解释语言。不幸的是我遇到了以下问题。测试时如下代码: def main() { def ks = Map[[1, 2]].keySet()
一直提示输入 1 到 10 的数字 - 结果应将 st、rd、th 和 nd 添加到数字中。编写一个程序,提示用户输入 1 到 10 之间的任意整数,然后以序数形式显示该整数并附加后缀。 public
我有这个 DownloadFile.java 并按预期下载该文件: import java.io.*; import java.net.URL; public class DownloadFile {
我想在 GUI 上添加延迟。我放置了 2 个 for 循环,然后重新绘制了一个标签,但这 2 个 for 循环一个接一个地执行,并且标签被重新绘制到最后一个。 我能做什么? for(int i=0;
我正在对对象 Student 的列表项进行一些测试,但是我更喜欢在 java 类对象中创建硬编码列表,然后从那里提取数据,而不是连接到数据库并在结果集中选择记录。然而,自从我这样做以来已经很长时间了,
我知道对象创建分为三个部分: 声明 实例化 初始化 classA{} classB extends classA{} classA obj = new classB(1,1); 实例化 它必须使用
我有兴趣使用 GPRS 构建车辆跟踪系统。但是,我有一些问题要问以前做过此操作的人: GPRS 是最好的技术吗?人们意识到任何问题吗? 我计划使用 Java/Java EE - 有更好的技术吗? 如果
我可以通过递归方法反转数组,例如:数组={1,2,3,4,5} 数组结果={5,4,3,2,1}但我的结果是相同的数组,我不知道为什么,请帮助我。 public class Recursion { p
有这样的标准方式吗? 包括 Java源代码-测试代码- Ant 或 Maven联合单元持续集成(可能是巡航控制)ClearCase 版本控制工具部署到应用服务器 最后我希望有一个自动构建和集成环境。
我什至不知道这是否可能,我非常怀疑它是否可能,但如果可以,您能告诉我怎么做吗?我只是想知道如何从打印机打印一些文本。 有什么想法吗? 最佳答案 这里有更简单的事情。 import javax.swin
我是一名优秀的程序员,十分优秀!