ScheduledThreadPoolExecutor
我们先来学习一下JDK1.5 API中关于这个类的详细介绍:
"可另行安排在给定的延迟后运行命令,或者定期执行命令。需要多个辅助线程时,或者要求 ThreadPoolExecutor 具有额外的灵活性或功能时,此类要优于 Timer。
一旦启用已延迟的任务就执行它,但是有关何时启用,启用后何时执行则没有任何实时保证。按照提交的先进先出 (FIFO) 顺序来启用那些被安排在同一执行时间的任务。
虽然此类继承自 ThreadPoolExecutor,但是几个继承的调整方法对此类并无作用。特别是,因为它作为一个使用 corePoolSize 线程和一个无界队列的固定大小的池,所以调整 maximumPoolSize 没有什么效果。"
在JDK1.5之前,我们关于定时/周期操作都是通过Timer来实现的。但是Timer有以下几种危险[JCIP]
a. Timer是基于绝对时间的。容易受系统时钟的影响。
b. Timer只新建了一个线程来执行所有的TimeTask。所有TimeTask可能会相关影响
c. Timer不会捕获TimerTask的异常,只是简单地停止。这样势必会影响其他TimeTask的执行。
如果你是使用JDK1.5以上版本,建议用ScheduledThreadPoolExecutor代替Timer。它基本上解决了上述问题。它采用相对时间,用线程池来执行TimerTask,会出来TimerTask异常。
下面通过一个简单的实例来阐述ScheduledThreadPoolExecutor的使用。
我们定期让定时器抛异常
我们定期从控制台打印系统时间
代码如下(参考了网上的一些代码,在此表示感谢)
-
import
java.util.concurrent.ScheduledThreadPoolExecutor;
-
import
java.util.concurrent.TimeUnit;
-
-
-
public
class
TestScheduledThreadPoolExecutor {
-
-
public
static
void
main(String[] args) {
-
ScheduledThreadPoolExecutor exec=new
ScheduledThreadPoolExecutor(
1
);
-
-
exec.scheduleAtFixedRate(new
Runnable(){
-
@Override
-
public
void
run() {
-
throw
new
RuntimeException();
-
}}, 1000
,
5000
, TimeUnit.MILLISECONDS);
-
-
exec.scheduleAtFixedRate(new
Runnable(){
-
@Override
-
public
void
run() {
-
System.out.println(System.nanoTime());
-
}}, 1000
,
2000
, TimeUnit.MILLISECONDS);
-
}
-
-
}
总结:是时候把你的定时器换成 ScheduledThreadPoolExecutor了
分享到:
相关推荐
源码解析文件ScheduledThreadPoolExecutor 在 Java 中,ScheduledThreadPoolExecutor 是一个线程池执行器,用于执行延迟任务。它使用DelayedWorkQueue来实现延迟的效果。下面是 ScheduledThreadPoolExecutor 的实现...
在Java 1.6版本之后,`java.util.concurrent` 包下引入了`ScheduledThreadPoolExecutor`,这是一个非常强大的工具,可以实现定时器和延时加载功能,相比旧的`Timer`类,它提供了更多的控制和并发处理能力。...
Java定时器线程池,即`ScheduledThreadPoolExecutor`,是Java并发编程中一个重要的工具,它继承自`ThreadPoolExecutor`并扩展了定时和周期性任务的执行能力。`ScheduledThreadPoolExecutor`提供了定时执行、延迟执行...
java线程类源码Java ScheduledThreadPoolExecutor演示 java.util.concurrent ScheduledThreadPoolExecutor作为java.util.Timer类的现代替代。
ScheduledThreadPoolExecutor可以配置为多线程生产单线程消费或多线程生产多线程消费,因此在日常开发中使用定时器功能时应该优先使用ScheduledThreadPoolExecutor。 在使用ScheduledThreadPoolExecutor时,需要...
在这个"javaweb 定时器工程"中,主要涉及到了两个关键组件:Quartz和ScheduledThreadPoolExecutor。 Quartz是一个开源的作业调度框架,它为Java应用程序提供了完全的作业调度能力。Quartz-all-1.8.6.jar是Quartz的...
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run...
首先,文档详细介绍了ScheduledThreadPoolExecutor类的结构和工作原理。这个类用于处理延时任务或定时任务,通过三种不同的任务提交方式:schedule、scheduledAtFixedRate、和scheduledWithFixedDelay。重点介绍了...
第一章:Java并发简介 1.1 什么是并发编程 1.2 Java中的并发编程模型 1.3 线程的生命周期 第二章:基础同步工具 ...6.2 ScheduledThreadPoolExecutor 第七章:Fork/Join框架 7.1 ForkJoinPool 等等
NULL 博文链接:https://cywhoyi.iteye.com/blog/1939040
- `java.util.concurrent.ScheduledThreadPoolExecutor`:调度线程池的核心实现,除了执行任务外,还能按预定的时间间隔执行。 4. 辅助类 - `java.util.concurrent.Executors`:提供了一些静态工厂方法,用于创建...
ScheduledThreadPoolExecutor scheduledExecutor = new ScheduledThreadPoolExecutor(3); Runnable task = () -> { // 任务代码 }; // 每隔5秒执行一次 scheduledExecutor.scheduleAtFixedRate(task, 0, 5, ...
在给出的描述中,“at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run”这部分可能是指EJB应用中使用了`ScheduledThreadPoolExecutor`来安排任务执行。`ScheduledThreadPoolExecutor`是...
除了`Timer`和`TimerTask`,Java 5引入了`java.util.concurrent`包,其中包含更强大的`ScheduledExecutorService`接口和`ScheduledThreadPoolExecutor`类。`ScheduledExecutorService`提供了一组用于延迟执行或定期...
Python的标准库 `concurrent.futures` 提供了 `ScheduledThreadPoolExecutor`,可以用来安排任务在未来某个时刻执行。 ```python from concurrent.futures import ScheduledThreadPoolExecutor import time ...
系统关闭采用线程池中ScheduledThreadPoolExecutor来设置计划任务。 6、用户并发选课控制,采用异步处理,并且使用缓存层Redis记录相关信息,同时采用aop编程思想,在第一次请求选课接口时,加载redis中lua脚本文件...
ExecutorService是线程池的基本服务接口,ThreadPoolExecutor是其具体实现,用于管理一组可重用的工作线程,而ScheduledThreadPoolExecutor则支持定时及周期性执行任务。 任务(Task)是在线程池中执行的工作单元,...
包括前端JS提交禁止按钮、Post/Redirect/Get模式、Session中存放特殊标志、借助数据库insert使用唯一索引、借助悲观锁、借助本地锁、本地锁使用ConcurrentHashMap和ScheduledThreadPoolExecutor等。 1. 什么是幂等...
Android开发者通常会使用`ThreadPoolExecutor`或`ScheduledThreadPoolExecutor`这两个实现了`ExecutorService`的类。 三、`ThreadPoolExecutor`详解 `ThreadPoolExecutor`是`ExecutorService`的一个具体实现,它...
- 创建的是`ScheduledThreadPoolExecutor`,它是`ThreadPoolExecutor`的子类,能够安排在未来某个时间点或周期性地执行任务。 - 同样使用`ScheduledThreadPoolExecutor`初始化,任务调度的实现更复杂,可以进行...