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实现定时器和延时加载功能,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
java线程类源码Java ScheduledThreadPoolExecutor演示 java.util.concurrent ScheduledThreadPoolExecutor作为java.util.Timer类的现代替代。
主要介绍了java 定时器线程池(ScheduledThreadPoolExecutor),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run...
NULL 博文链接:https://cywhoyi.iteye.com/blog/1939040
系统关闭采用线程池中ScheduledThreadPoolExecutor来设置计划任务。 6、用户并发选课控制,采用异步处理,并且使用缓存层Redis记录相关信息,同时采用aop编程思想,在第一次请求选课接口时,加载redis中lua脚本文件...
22.线程池之ScheduledThreadPoolExecutor 23.FutureTask基本操作总结 24.Java中atomic包中的原子操作类总结 25.大白话说java并发工具类-CountDownLatch,CyclicBarrier 26.大白话说java并发工具类-Semaphore,...
EJB at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run
3. “要使用带有ThreadFactory参数的ScheduledThreadPoolExecutor构造方法哦,这样你就可以方便的设置线程名字啦 1. 添加
java游戏服务器中,需要使用到的定时器功能 现在要讲解的是一个quartz-all-1.8.6.jar另外一个是ScheduledThreadPoolExecutor。
AQS相关应用(CountDownLatch、CyclicBarrier、Semaphore等),executor(ThreadPoolExecutor、ScheduledThreadPoolExecutor、FutureTask等),collection(ConcurrentHashMap、CopyOnWriteArrayList等), ...
(所有Class父类)Reflect类(支持C++类反射)Exception类(各类异常)Thread类 (实现了线程的创建,退出)线程池类 (实现了ThreadExecutorPool,ThreadCachedPoolExecutor,ScheduledThreadPoolExecutor)线程锁...
Executor框架主要由3部分组成: ...Executor框架有两个关键类实现了ExecutorService接口(ThreadPoolExecutor和ScheduledThreadPoolExecutor)。 异步计算的结果 。包括Future和实现Future的FutureTask类。
monitor-thread 普通JDK自带的线程池时无法实现线程池的自动切换,基于监控与上下文自动切换的需求,封住了一套taxi开头的线程池,接...2)ScheduledThreadPoolExecutor<-------->WrapTaxiScheduledThreadPoolEx
在我了解的过程中发现java实现定时任务有四种,首先是jdk自带的两个Timer,ScheduledThreadPoolExecutor,后者是jdk1.5提出的,因为这个Timer毛病着实有点多,像什么单线程,出问题了其他任务也执
将Apple的Grand Central Dispatch和Android的ScheduledThreadPoolExecutor用于Delphi计时器您可能已经很熟悉iOS / macOS上的NSTimer和Android上用于计时器事件的JTimer。 除了基本计时器之外,大多数操作系统还提供...
集成基于 java.util.concurrent.ScheduledThreadPoolExecutor 的自定义实现,因此应该可用于各种应用程序。 用法 服务器组件应该作为一个独立的 Java 应用程序使用如下命令运行: java -jarbouncer-1.0.0.jar --...
它的工作方式类似于Java类ScheduledThreadPoolExecutor ,但是它具有一些高级功能: :固定时间(例如00:30),CRON表达式或基于代码的自定义表达式, 可以检索有关每个作业执行的信息, 可能配置, 在较少要同时...
迅雷笔试题java Java并发编程:03-多线程...ScheduledThreadPoolExecutor 05 守护线程的使用 06 原子增长类: AtomicLong 07 计时器的使用CountDownLatch 08 并发量的控制(信号量): Semaphore 09 阻塞队列的使用: Lin