如果我们想要延迟(deferred)或者周期性(periodic)执行一个任务,我们可以使用Java API 的Timer和TimerTask类。

一般步骤是:

继承TimerTask(抽象类),复写run方法,方法体里代表需要执行的任务。

实例化Timer(可以通过构造方法设置为守护线程),调用schedule的一个重载方法实现延迟或者周期性执行自定义任务。

下面的例子演示了程序启动5秒后每隔1秒警报器叫一声,10次后终止程序执行。

Java代码
  1. import java.awt.Toolkit;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. /**
  5. * 自定义Timer类
  6. *
  7. */
  8. class BeepTimer extends TimerTask {
  9. private Toolkit toolKit;
  10. private int count;
  11. public BeepTimer() {
  12. toolKit = Toolkit.getDefaultToolkit();
  13. }
  14. @Override
  15. public void run() {
  16. if (count == 10)
  17. System.exit(1);
  18. toolKit.beep();
  19. count++;
  20. }
  21. }
  22. public class TimerDemo {
  23. public static void main(String... args) {
  24. BeepTimer bt = new BeepTimer(); //非守护线程
  25. Timer timer = new Timer();
  26. timer.schedule(bt, 5 * 1000, 1 * 1000); // 5秒后开始鸣叫,鸣叫10次,每次相隔1秒钟
  27. }
  28. }
import java.awt.Toolkit;
import java.util.Timer;
import java.util.TimerTask;/*** 自定义Timer类* */
class BeepTimer extends TimerTask {private Toolkit toolKit;private int count;public BeepTimer() {toolKit = Toolkit.getDefaultToolkit();}@Overridepublic void run() {if (count == 10)System.exit(1);toolKit.beep();count++;}}public class TimerDemo {public static void main(String... args) {BeepTimer bt = new BeepTimer(); //非守护线程Timer timer = new Timer();timer.schedule(bt, 5 * 1000, 1 * 1000); // 5秒后开始鸣叫,鸣叫10次,每次相隔1秒钟}}

但是Timer和TimerTask存在一些缺陷:

1:Timer只创建了一个线程。当你的任务执行的时间超过设置的延时时间将会产生一些问题。

2:Timer创建的线程没有处理异常,因此一旦抛出非受检异常,该线程会立即终止。

JDK 5.0以后推荐使用ScheduledThreadPoolExecutor。该类属于Executor Framework,它除了能处理异常外,还可以创建多个线程解决上面的问题。

下面利用ScheduledThradPoolExecutor实现同一个功能。

Java代码
  1. import java.awt.Toolkit;
  2. import java.util.concurrent.ScheduledThreadPoolExecutor;
  3. import java.util.concurrent.TimeUnit;
  4. public class ExecutorDemo {
  5. public static void main(String... args) {
  6. ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(10);
  7. MyTask myTask = new MyTask();
  8. stpe.scheduleWithFixedDelay(myTask, 5,1,TimeUnit.SECONDS);
  9. }
  10. private static class MyTask implements Runnable {
  11. private Toolkit toolKit;
  12. private int count;
  13. public MyTask() {
  14. toolKit = Toolkit.getDefaultToolkit();
  15. }
  16. @Override
  17. public void run() {
  18. if(count == 10) {
  19. System.out.println("Termination!");
  20. System.exit(1);
  21. }
  22. toolKit.beep();
  23. System.out.println("Beep--------");
  24. count++;
  25. }
  26. }
  27. }
import java.awt.Toolkit;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class ExecutorDemo {public static void main(String... args) {ScheduledThreadPoolExecutor stpe = new ScheduledThreadPoolExecutor(10);MyTask myTask = new MyTask();stpe.scheduleWithFixedDelay(myTask, 5,1,TimeUnit.SECONDS);}private static class MyTask implements Runnable {private Toolkit toolKit;private int count;public MyTask() {toolKit = Toolkit.getDefaultToolkit();}@Overridepublic void run() {if(count == 10) {System.out.println("Termination!");System.exit(1);}toolKit.beep();System.out.println("Beep--------");count++;}}
}

转载于:https://www.cnblogs.com/shhaoran/archive/2013/02/05/2924517.html

使用ScheduledThreadPoolExecutor代替TimerTimerTask相关推荐

  1. ScheduledThreadPoolExecutor()定时执行线程池详解,java线程池

    为什么80%的码农都做不了架构师?>>>    package com.dy.pool;import java.util.concurrent.ExecutorService; im ...

  2. ScheduledThreadPoolExecutor详解

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要分为两个部分,第一部分首先会对ScheduledThreadPoolExecutor进行简单的介绍,并且会介绍其主要A ...

  3. ScheduledThreadPoolExecutor的相关知识

    转载请标明出处:[顾林海的博客] 个人开发的微信小程序,目前功能是书籍推荐,后续会完善一些新功能,希望大家多多支持! ##前言 ScheduledThreadPoolExecutor继承自Thread ...

  4. (二十)java多线程之ScheduledThreadPoolExecutor

    本人邮箱: <kco1989@qq.com> 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://github.co ...

  5. java定时器返回future_java 定时器线程池(ScheduledThreadPoolExecutor)的实现

    前言 定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行.但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通Thre ...

  6. ScheduledThreadPoolExecutor定时任务线程池执行原理分析

    一.示例代码 @Slf4j public class ScheduleThreadPoolTest {private static ScheduledExecutorService executor ...

  7. 线程池之ScheduledThreadPoolExecutor线程池源码分析笔记

    1.ScheduledThreadPoolExecutor 整体结构剖析. 1.1类图介绍 根据上面类图图可以看到Executor其实是一个工具类,里面提供了好多静态方法,根据用户选择返回不同的线程池 ...

  8. Java并发编程—ScheduledThreadPoolExecutor原理分析

    原文作者:小付 原文地址:ScheduledThreadPoolExecutor原理分析 目录 一.简单使用 二.类UML图 三.处理流程 四.任务提交方式 五.SchduledFutureTask之 ...

  9. java定时线程池_java 定时器线程池(ScheduledThreadPoolExecutor)的实现

    前言 定时器线程池提供了定时执行任务的能力,即可以延迟执行,可以周期性执行.但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外一篇文章多线程–精通Thre ...

最新文章

  1. 项目管理理论与实践(4)——UML应用(上)
  2. matlab 2014a 升级,MATLAB R2014a从入门到精通(升级版) pdf扫描版[42MB]
  3. 操作系统:基本分页存储管理方式
  4. 网络基础:分享几个路由器设置小技巧,总有用得到的一天!
  5. Oracle Grid 11.2.0.4 安装是出现INS-30510: Insufficient number of ASM disks selected.
  6. 【SPFA】Party(jzoj 1328)
  7. Java第五次作业--面向对象高级特性(抽象类和接口)
  8. 对话系统答非所问?快试试这篇ACL'21的连贯性评估大法
  9. 计组之数据运算:1、数据的表示
  10. 某东商城获取eid和fp参数方法
  11. Leetcode每日一题:56. I. 数组中数字出现的次数
  12. 用计算机弹极乐净土谱,极乐净土计算器谱
  13. 贝叶斯统计:概率思维的魔法
  14. 第39级台阶 蓝桥杯递归 java
  15. 数据分析_表和表的运用
  16. 爬虫练习--豆瓣英美剧爬虫
  17. 全球都在乘“云”而上,从十几亿暴涨至千亿规模的云计算究竟是什么来头?
  18. 王半仙儿的日记-0006
  19. 汽车电子系统网络安全指南与汽车信息物理融合系统网络安全指南
  20. windows10 家庭版 安装docker

热门文章

  1. vgg16卷积层的计算量_深度学习_经典网络_VGG16和ResNet152哪个参数量更多
  2. python算法书推荐-你也能看得懂的Python算法书
  3. Linux下Git和GitHub使用方法总结(Ubuntu16.04)
  4. 全国计算机二级qq闪退,电脑上QQ闪退怎么回事?各个系统版本电脑QQ闪退现象的解决方法介绍...
  5. mybatis mapper.xml 文件共用_MyBatis 缓存原来是这么一回事儿!| 原力计划
  6. ensp支持哪个版本virtualbox_如何在 Fedora 中安装 VirtualBox
  7. python3 爬虫 requests安装_爬虫开发环境部署
  8. poj1743(后缀数组:最长不可重叠子串长度)
  9. linux 关闭redis 命令_redis----------linux和mac如何安装redis和启动,关闭
  10. MATLAB实现实时录音,语音采集与读写用matlab实现录音以及语谱图的绘制.pdf