1. 程式人生 > >java定時任務調度工具

java定時任務調度工具

線程並發 主類 結束時間 his 什麽 支持 異常 pos 方法

一、什麽是定時任務調度

  基於給定的時間點,給定的時間間隔或者給定的時間執行次數自動執行的任務。

二、java中常用的定時任務調度工具:

  • Timer
  • Quartz  

2.1兩者區別:

  • Timer源自jdk,Quartz需要額外引入jar包。
  • Timer功能少,使用方便,能解決許多常見問題。Quartz功能強大,使用麻煩,能解決幾乎所有問題。
  • Timer底層通過線程執行定時任務。Quartz底層通過多個線程池執行定時任務。

2.2Timer簡介

定義:有且僅有一個後臺線程多個業務線程,進行定時定頻率的調動

構建:Timer有四個組成部分:

  • Timer:定時任務調度工具主類。
  • TimerTask:定時任務,裏面有run方法
  • TimerThread:後臺負責執行的定時線程
  • TaskQueue:定時任務隊列

  其中最重要的部分為Timer和TimerTask。

Timer使用方法:

/**
 * 定義TimerTask
 */
class MyTimerTask extends TimerTask{
    
    private String name;
    
    public MyTimerTask(String name) {
        this.name = name;
    }
    
    public void setName(String name) {
        this
.name = name; } public String getName() { return name; } @Override public void run() { System.out.println("current exec name:" + new Date() + " " + name); } }
public class Main {

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf 
= new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); //1.創建一個timer Timer timer = new Timer(); //2.創建一個timerTask TimerTask task = new MyTimerTask("first"); //設定調用頻率 // timer.schedule(task, sdf.parse("2018/3/24 10:42:30"));//Date time 在執行的時間執行,如果時間已經過去了,則會立即執行。不會重復執行 // timer.schedule(task, 1000L);//Long delay 延遲指定的毫秒數後執行。不會重復執行 // timer.schedule(task, sdf.parse("2018/3/24 10:42:30"), 1000L);//Date firstTime, Long period 指定第一次的執行時間,如果時間已經過去了,則會立即執行,之後在指定的毫秒數後再次執行 // timer.schedule(task, 2000L, 1000L);//Long delay, Long period 第一次執行延遲delay毫秒,之後每隔period秒重復執行。 // timer.scheduleAtFixedRate(task, sdf.parse("2018/3/24 10:50:10"), 10000L);//指定第一次的執行時間,之後在指定的毫秒數後再次執行,如果時間已經過去了,會對這期間的線程進行補充執行,存在並發的可能 timer.scheduleAtFixedRate(task, 1000L, 10000L); } }

在Timer類中,執行定時任務的方法名主要分為scheduleAtFixedRate和schedule。兩者區別:

1、schedule方法不會對錯過的任務補充執行。scheduleAtFixtedRate發發會對錯過的任務進行補充執行。

例如:假如有定時任務12:00:00執行,之後每2秒重復執行。但當前時間已經是12:10:00。則schedule會立即對task執行一次,之後每間隔兩秒重復執行,scheduleAtFixedRate會立即對task執行10*60/2次,之後會以12:00:00的間隔時間開始執行。

2、schedule重復執行的時間從上一次任務執行結束時間開始。scheduleAtFixedRate重復執行的時間從上一次任務開始執行的時間開始。

例如:有定時任務執行需要6秒的時間,兩次任務之間的間隔是5秒。則schedule第一次執行時間12:00:00,第二次執行時間12:00:11。scheduleAtFixedRate第一次執行時間12:00:00,第二次執行時間12:00:05。

綜上,使用scheduleAtFixedRate時,需要考慮線程並發的問題。

其他的重要方法:

  TimerTask.cancel():執行本地task後,取消當前定時任務調度。

  TimerTask.schedule():返回最近執行這項任務被調度的時間。

  Timer.cancel():終止當前定時器,取消定時器內所有的待執行任務。

  Timer.purge():從定時器中移出所有已取消的任務,返回取消數量。

2.3Timer的缺陷

  • 由於只有一個後臺線程,因此不支持多線程並發。即如果一個定時器中有多個定時任務,同一時間開始執行,則它們的開始執行時間不一定相同。
  • 當其中一個任務拋出運行時異常,整個定時器會停止所有任務將拋出異常。

java定時任務調度工具