首頁> Java> Java基礎> 主體

java如何定時執行任務

angryTom
發布: 2019-11-14 16:41:36
原創
5007 人瀏覽過

java如何定時執行任務

java如何定時執行一個方法

java實作定時功能有多種方式,以下介紹3種:

1、建立一個執行緒.

import java.util.Date; public class ThreadTest { public static void main(String[] args) { // 设置执行周期 final long timeInterval = 3000; Runnable runnable = new Runnable() { public void run() { while (true) { System.out.println("Task Run ... " + new Date()); try { Thread.sleep(timeInterval); } catch (InterruptedException e) { e.printStackTrace(); } } } }; Thread thread = new Thread(runnable); thread.start(); } }
登入後複製

2、使用JDK 自帶的API Timer 以及TaskTimer。

這種方式和第一種簡單粗暴的方式有什麼區別呢,主要體現在使用API 可以在指定的時間開始啟動任務,可以延期執行首次任務,同樣也看可以設置一定的時間間隔,但是原理是一樣的,後台還是啟動了一個線程,應該說是只有一個線程在執行任務,不管我們啟動的Task 有幾個。所以這也會有問題,比方說一個一個任務沒有執行完成,另一個任務就開始執行了,可能會發生並發問題。還有若是一個任務中報錯,則執行緒就會被停止。

import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class MyTask extends TimerTask{ private String name; public MyTask(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public void run() { SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sf.format(new Date()); System.out.println("exec MyTask ... 当前时间为:" + format); System.out.println(this.name +" 正在执行!" + sf.format(new Date())); } public static void main(String[] args) { Timer timer = new Timer(); TimerTask task1 = new MyTask("Tasks 1"); TimerTask task2 = new MyTask("Tasks 2"); Calendar calendar1 = Calendar.getInstance(); calendar1.add(Calendar.SECOND, 3); Calendar calendar2 = Calendar.getInstance(); calendar2.add(Calendar.SECOND, 5); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format = sf.format(new Date()); System.out.println("当前时间为:" + format); timer.schedule(task1, calendar1.getTime(), 3000L); timer.schedule(task2, calendar2.getTime(), 3000L); } }
登入後複製

其實在 Timer 中,封裝了一個 Task 的佇列和 Time 的執行緒對象,我們自訂的 Task 的參考會放在佇列中等待執行。

大致上就是這麼一個關係 Timer - TimerThread - TaskQueue - MyTask - run 當然最終執行的方法肯定是我們自訂任務中的 run 方法。因為我們自訂的任務已經繼承了 TimeTask ,而這個類別已經實作了 Runnable 介面。

3、使用ScheduledExecutorService

ScheduledExecutorService是做為並發工具類別被引進的,這是最理想的定時任務實作方式。

1.比起Timer的單線程,它是透過線程池的方式來執行任務的。

2.可以很靈活的去設定第一次執行任務delay時間。

3.提供了良好的約定,以便設定執行的時間間隔。

import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class qwe { public static void main(String[] args) { //新建定时任务 Runnable runnable = new Runnable() { //run方法中是定时执行的操作 public void run() { System.out.println(new Date()); } }; ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); /* * 参数一:command:执行线程 * 参数二:initialDelay:初始化延时 * 参数三:period:两次开始执行最小间隔时间 * 参数四:unit:计时单位 */ service.scheduleAtFixedRate(runnable, 0, 60, TimeUnit.SECONDS); } }
登入後複製

php中文網,大量的免費Java入門教學,歡迎線上學習!

#

以上是java如何定時執行任務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!