亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
問題 1:任務(wù)執(zhí)行時(shí)間長影響其他任務(wù)
問題 2:任務(wù)異常影響其他任務(wù)
① 任務(wù)超時(shí)執(zhí)行測試
② 任務(wù)異常測試
ScheduledExecutorService 小結(jié)
首頁 Java Java基礎(chǔ) 介紹java 定時(shí)任務(wù)最簡單的3種實(shí)作方法

介紹java 定時(shí)任務(wù)最簡單的3種實(shí)作方法

Dec 29, 2020 pm 05:45 PM
java 定時(shí)任務(wù)

java基礎(chǔ)教程介紹定時(shí)任務(wù)在實(shí)際的開發(fā)

介紹java 定時(shí)任務(wù)最簡單的3種實(shí)作方法

推薦(免費(fèi)):java基礎(chǔ)教程

日子匆匆穿過我而行,奔向海洋。

定時(shí)任務(wù)在實(shí)際的開發(fā)中特別常見,比如電商平臺(tái) 30 分鐘后自動(dòng)取消未支付的訂單,以及凌晨的數(shù)據(jù)匯總和備份等,都需要借助定時(shí)任務(wù)來實(shí)現(xiàn),那么我們本文就來看一下定時(shí)任務(wù)最簡單的幾種實(shí)現(xiàn)方式。

TOP 1:Timer

Timer 是 JDK 自帶的定時(shí)任務(wù)執(zhí)行類,無論任何項(xiàng)目都可以直接使用 Timer 來實(shí)現(xiàn)定時(shí)任務(wù),所以 Timer 的優(yōu)點(diǎn)就是使用方便,它的實(shí)現(xiàn)代碼如下:

public?class?MyTimerTask?{
????public?static?void?main(String[]?args)?{
????????//?定義一個(gè)任務(wù)
????????TimerTask?timerTask?=?new?TimerTask()?{
????????????@Override
????????????public?void?run()?{
????????????????System.out.println("Run?timerTask:"?+?new?Date());
????????????}
????????};
????????//?計(jì)時(shí)器
????????Timer?timer?=?new?Timer();
????????//?添加執(zhí)行任務(wù)(延遲?1s?執(zhí)行,每?3s?執(zhí)行一次)
????????timer.schedule(timerTask,?1000,?3000);
????}
}

程序執(zhí)行結(jié)果如下:

Run?timerTask:Mon?Aug?17?21:29:25?CST?2020
Run?timerTask:Mon?Aug?17?21:29:28?CST?2020
Run?timerTask:Mon?Aug?17?21:29:31?CST?2020

Timer 缺點(diǎn)分析

Timer 類實(shí)現(xiàn)定時(shí)任務(wù)雖然方便,但在使用時(shí)需要注意以下問題。

問題 1:任務(wù)執(zhí)行時(shí)間長影響其他任務(wù)

當(dāng)一個(gè)任務(wù)的執(zhí)行時(shí)間過長時(shí),會(huì)影響其他任務(wù)的調(diào)度,如下代碼所示:

public?class?MyTimerTask?{
????public?static?void?main(String[]?args)?{
????????//?定義任務(wù)?1
????????TimerTask?timerTask?=?new?TimerTask()?{
????????????@Override
????????????public?void?run()?{
????????????????System.out.println("進(jìn)入?timerTask?1:"?+?new?Date());
????????????????try?{
????????????????????//?休眠?5?秒
????????????????????TimeUnit.SECONDS.sleep(5);
????????????????}?catch?(InterruptedException?e)?{
????????????????????e.printStackTrace();
????????????????}
????????????????System.out.println("Run?timerTask?1:"?+?new?Date());
????????????}
????????};
????????//?定義任務(wù)?2
????????TimerTask?timerTask2?=?new?TimerTask()?{
????????????@Override
????????????public?void?run()?{
????????????????System.out.println("Run?timerTask?2:"?+?new?Date());
????????????}
????????};
????????//?計(jì)時(shí)器
????????Timer?timer?=?new?Timer();
????????//?添加執(zhí)行任務(wù)(延遲?1s?執(zhí)行,每?3s?執(zhí)行一次)
????????timer.schedule(timerTask,?1000,?3000);
????????timer.schedule(timerTask2,?1000,?3000);
????}
}

程序執(zhí)行結(jié)果如下:

進(jìn)入?timerTask?1:Mon?Aug?17?21:44:08?CST?2020
Run?timerTask?1:Mon?Aug?17?21:44:13?CST?2020
Run?timerTask?2:Mon?Aug?17?21:44:13?CST?2020
進(jìn)入?timerTask?1:Mon?Aug?17?21:44:13?CST?2020
Run?timerTask?1:Mon?Aug?17?21:44:18?CST?2020
進(jìn)入?timerTask?1:Mon?Aug?17?21:44:18?CST?2020
Run?timerTask?1:Mon?Aug?17?21:44:23?CST?2020
Run?timerTask?2:Mon?Aug?17?21:44:23?CST?2020
進(jìn)入?timerTask?1:Mon?Aug?17?21:44:23?CST?2020

從上述結(jié)果中可以看出,當(dāng)任務(wù) 1 運(yùn)行時(shí)間超過設(shè)定的間隔時(shí)間時(shí),任務(wù) 2 也會(huì)延遲執(zhí)行。 原本任務(wù) 1 和任務(wù) 2 的執(zhí)行時(shí)間間隔都是 3s,但因?yàn)槿蝿?wù) 1 執(zhí)行了 5s,因此任務(wù) 2 的執(zhí)行時(shí)間間隔也變成了 10s(和原定時(shí)間不符)。

問題 2:任務(wù)異常影響其他任務(wù)

使用 Timer 類實(shí)現(xiàn)定時(shí)任務(wù)時(shí),當(dāng)一個(gè)任務(wù)拋出異常,其他任務(wù)也會(huì)終止運(yùn)行,如下代碼所示:

public?class?MyTimerTask?{
????public?static?void?main(String[]?args)?{
????????//?定義任務(wù)?1
????????TimerTask?timerTask?=?new?TimerTask()?{
????????????@Override
????????????public?void?run()?{
????????????????System.out.println("進(jìn)入?timerTask?1:"?+?new?Date());
????????????????//?模擬異常
????????????????int?num?=?8?/?0;
????????????????System.out.println("Run?timerTask?1:"?+?new?Date());
????????????}
????????};
????????//?定義任務(wù)?2
????????TimerTask?timerTask2?=?new?TimerTask()?{
????????????@Override
????????????public?void?run()?{
????????????????System.out.println("Run?timerTask?2:"?+?new?Date());
????????????}
????????};
????????//?計(jì)時(shí)器
????????Timer?timer?=?new?Timer();
????????//?添加執(zhí)行任務(wù)(延遲?1s?執(zhí)行,每?3s?執(zhí)行一次)
????????timer.schedule(timerTask,?1000,?3000);
????????timer.schedule(timerTask2,?1000,?3000);
????}
}

程序執(zhí)行結(jié)果如下:

進(jìn)入?timerTask?1:Mon?Aug?17?22:02:37?CST?2020
Exception?in?thread?"Timer-0"?java.lang.ArithmeticException:?/?by?zero
????at?com.example.MyTimerTask$1.run(MyTimerTask.java:21)
????at?java.util.TimerThread.mainLoop(Timer.java:555)
????at?java.util.TimerThread.run(Timer.java:505)
Process?finished?with?exit?code?0

Timer 小結(jié)

Timer 類實(shí)現(xiàn)定時(shí)任務(wù)的優(yōu)點(diǎn)是方便,因?yàn)樗?JDK 自定的定時(shí)任務(wù),但缺點(diǎn)是任務(wù)如果執(zhí)行時(shí)間太長或者是任務(wù)執(zhí)行異常,會(huì)影響其他任務(wù)調(diào)度,所以在生產(chǎn)環(huán)境下建議謹(jǐn)慎使用。

TOP 2:ScheduledExecutorService

ScheduledExecutorService 也是 JDK 1.5 自帶的 API,我們可以使用它來實(shí)現(xiàn)定時(shí)任務(wù)的功能,也就是說 ScheduledExecutorService 可以實(shí)現(xiàn) Timer 類具備的所有功能,并且它可以解決了 Timer 類存在的所有問題。

ScheduledExecutorService 實(shí)現(xiàn)定時(shí)任務(wù)的代碼示例如下:

public?class?MyScheduledExecutorService?{
????public?static?void?main(String[]?args)?{
????????//?創(chuàng)建任務(wù)隊(duì)列
????????ScheduledExecutorService?scheduledExecutorService?=
????????????????Executors.newScheduledThreadPool(10);?//?10?為線程數(shù)量
????????//?執(zhí)行任務(wù)
????????scheduledExecutorService.scheduleAtFixedRate(()?->?{
????????????System.out.println("Run?Schedule:"?+?new?Date());
????????},?1,?3,?TimeUnit.SECONDS);?//?1s?后開始執(zhí)行,每?3s?執(zhí)行一次
????}
}

程序執(zhí)行結(jié)果如下:

Run?Schedule:Mon?Aug?17?21:44:23?CST?2020
Run?Schedule:Mon?Aug?17?21:44:26?CST?2020
Run?Schedule:Mon?Aug?17?21:44:29?CST?2020

ScheduledExecutorService 可靠性測試

① 任務(wù)超時(shí)執(zhí)行測試

ScheduledExecutorService 可以解決 Timer 任務(wù)之間相應(yīng)影響的缺點(diǎn),首先我們來測試一個(gè)任務(wù)執(zhí)行時(shí)間過長,會(huì)不會(huì)對其他任務(wù)造成影響,測試代碼如下:

public?class?MyScheduledExecutorService?{
????public?static?void?main(String[]?args)?{
????????//?創(chuàng)建任務(wù)隊(duì)列
????????ScheduledExecutorService?scheduledExecutorService?=
????????????????Executors.newScheduledThreadPool(10);
????????//?執(zhí)行任務(wù)?1
????????scheduledExecutorService.scheduleAtFixedRate(()?->?{
????????????System.out.println("進(jìn)入?Schedule:"?+?new?Date());
????????????try?{
????????????????//?休眠?5?秒
????????????????TimeUnit.SECONDS.sleep(5);
????????????}?catch?(InterruptedException?e)?{
????????????????e.printStackTrace();
????????????}
????????????System.out.println("Run?Schedule:"?+?new?Date());
????????},?1,?3,?TimeUnit.SECONDS);?//?1s?后開始執(zhí)行,每?3s?執(zhí)行一次
????????//?執(zhí)行任務(wù)?2
????????scheduledExecutorService.scheduleAtFixedRate(()?->?{
????????????System.out.println("Run?Schedule2:"?+?new?Date());
????????},?1,?3,?TimeUnit.SECONDS);?//?1s?后開始執(zhí)行,每?3s?執(zhí)行一次
????}
}

程序執(zhí)行結(jié)果如下:

Run?Schedule2:Mon?Aug?17?11:27:55?CST?2020
進(jìn)入?Schedule:Mon?Aug?17?11:27:55?CST?2020
Run?Schedule2:Mon?Aug?17?11:27:58?CST?2020
Run?Schedule:Mon?Aug?17?11:28:00?CST?2020
進(jìn)入?Schedule:Mon?Aug?17?11:28:00?CST?2020
Run?Schedule2:Mon?Aug?17?11:28:01?CST?2020
Run?Schedule2:Mon?Aug?17?11:28:04?CST?2020

從上述結(jié)果可以看出,當(dāng)任務(wù) 1 執(zhí)行時(shí)間 5s 超過了執(zhí)行頻率 3s 時(shí),并沒有影響任務(wù) 2 的正常執(zhí)行,因此使用 ScheduledExecutorService 可以避免任務(wù)執(zhí)行時(shí)間過長對其他任務(wù)造成的影響。

② 任務(wù)異常測試

接下來我們來測試一下 ScheduledExecutorService 在一個(gè)任務(wù)異常時(shí),是否會(huì)對其他任務(wù)造成影響,測試代碼如下:

public?class?MyScheduledExecutorService?{
????public?static?void?main(String[]?args)?{
????????//?創(chuàng)建任務(wù)隊(duì)列
????????ScheduledExecutorService?scheduledExecutorService?=
????????????????Executors.newScheduledThreadPool(10);
????????//?執(zhí)行任務(wù)?1
????????scheduledExecutorService.scheduleAtFixedRate(()?->?{
????????????System.out.println("進(jìn)入?Schedule:"?+?new?Date());
????????????//?模擬異常
????????????int?num?=?8?/?0;
????????????System.out.println("Run?Schedule:"?+?new?Date());
????????},?1,?3,?TimeUnit.SECONDS);?//?1s?后開始執(zhí)行,每?3s?執(zhí)行一次
????????//?執(zhí)行任務(wù)?2
????????scheduledExecutorService.scheduleAtFixedRate(()?->?{
????????????System.out.println("Run?Schedule2:"?+?new?Date());
????????},?1,?3,?TimeUnit.SECONDS);?//?1s?后開始執(zhí)行,每?3s?執(zhí)行一次
????}
}

程序執(zhí)行結(jié)果如下:

進(jìn)入?Schedule:Mon?Aug?17?22:17:37?CST?2020
Run?Schedule2:Mon?Aug?17?22:17:37?CST?2020
Run?Schedule2:Mon?Aug?17?22:17:40?CST?2020
Run?Schedule2:Mon?Aug?17?22:17:43?CST?2020

從上述結(jié)果可以看出,當(dāng)任務(wù) 1 出現(xiàn)異常時(shí),并不會(huì)影響任務(wù) 2 的執(zhí)行。

ScheduledExecutorService 小結(jié)

在單機(jī)生產(chǎn)環(huán)境下建議使用 ScheduledExecutorService 來執(zhí)行定時(shí)任務(wù),它是 JDK 1.5 之后自帶的 API,因此使用起來也比較方便,并且使用 ScheduledExecutorService 來執(zhí)行任務(wù),不會(huì)造成任務(wù)間的相互影響。

TOP 3:Spring Task

如果使用的是 Spring 或 Spring Boot 框架,可以直接使用 Spring Framework 自帶的定時(shí)任務(wù),使用上面兩種定時(shí)任務(wù)的實(shí)現(xiàn)方式,很難實(shí)現(xiàn)設(shè)定了具體時(shí)間的定時(shí)任務(wù),比如當(dāng)我們需要每周五來執(zhí)行某項(xiàng)任務(wù)時(shí),但如果使用 Spring Task 就可輕松的實(shí)現(xiàn)此需求。

以 Spring Boot 為例,實(shí)現(xiàn)定時(shí)任務(wù)只需兩步:

  1. 開啟定時(shí)任務(wù);
  2. 添加定時(shí)任務(wù)。

具體實(shí)現(xiàn)步驟如下。

① 開啟定時(shí)任務(wù)

開啟定時(shí)任務(wù)只需要在 Spring Boot 的啟動(dòng)類上聲明 @EnableScheduling?即可,實(shí)現(xiàn)代碼如下:

@SpringBootApplication
@EnableScheduling?//?開啟定時(shí)任務(wù)
public?class?DemoApplication?{
????//?do?someing
}

② 添加定時(shí)任務(wù)

定時(shí)任務(wù)的添加只需要使用 @Scheduled?注解標(biāo)注即可,如果有多個(gè)定時(shí)任務(wù)可以創(chuàng)建多個(gè) @Scheduled 注解標(biāo)注的方法,示例代碼如下:

import?org.springframework.scheduling.annotation.Scheduled;
import?org.springframework.stereotype.Component;

@Component?//?把此類托管給?Spring,不能省略
public?class?TaskUtils?{
????//?添加定時(shí)任務(wù)
????@Scheduled(cron?=?"59?59?23?0?0?5")?//?cron?表達(dá)式,每周五?23:59:59?執(zhí)行
????public?void?doTask(){
????????System.out.println("我是定時(shí)任務(wù)~");
????}
}

注意:定時(shí)任務(wù)是自動(dòng)觸發(fā)的無需手動(dòng)干預(yù),也就是說 Spring Boot 啟動(dòng)后會(huì)自動(dòng)加載并執(zhí)行定時(shí)任務(wù)。

Cron 表達(dá)式

Spring Task 的實(shí)現(xiàn)需要使用 cron 表達(dá)式來聲明執(zhí)行的頻率和規(guī)則,cron 表達(dá)式是由 6 位或者 7 位組成的(最后一位可以省略),每位之間以空格分隔,每位從左到右代表的含義如下:
介紹java 定時(shí)任務(wù)最簡單的3種實(shí)作方法

其中 * 和 ? 號(hào)都表示匹配所有的時(shí)間。

介紹java 定時(shí)任務(wù)最簡單的3種實(shí)作方法
cron 表達(dá)式在線生成地址:https://cron.qqe2.com/

以上是介紹java 定時(shí)任務(wù)最簡單的3種實(shí)作方法的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級(jí)或工作區(qū)級(jí)路徑,用於自定義VSCode設(shè)置。 1.用戶級(jí)路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級(jí)路徑:項(xiàng)目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動(dòng)提交模式,再執(zhí)行多個(gè)操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個(gè)SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時(shí)應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

Python Itertools組合示例 Python Itertools組合示例 Jul 31, 2025 am 09:53 AM

itertools.combinations用於生成從可迭代對像中選取指定數(shù)量元素的所有不重複組合(順序無關(guān)),其用法包括:1.從列表中選2個(gè)元素組合,如('A','B')、('A','C')等,避免重複順序;2.對字符串取3個(gè)字符組合,如"abc"、"abd",適用於子序列生成;3.求兩數(shù)之和等於目標(biāo)值的組合,如1 5=6,簡化雙重循環(huán)邏輯;組合與排列的區(qū)別在於順序是否重要,combinations視AB與BA為相同,而permutations視為不同;

故障排除常見的java`ofmemoryError`場景'' 故障排除常見的java`ofmemoryError`場景'' Jul 31, 2025 am 09:07 AM

java.lang.OutOfMemoryError:Javaheapspace表示堆內(nèi)存不足,需檢查大對象處理、內(nèi)存洩漏及堆設(shè)置,通過堆轉(zhuǎn)儲(chǔ)分析工具定位並優(yōu)化代碼;2.Metaspace錯(cuò)誤因類元數(shù)據(jù)過多,常見於動(dòng)態(tài)類生成或熱部署,應(yīng)限制MaxMetaspaceSize並優(yōu)化類加載;3.Unabletocreatenewnativethread因係統(tǒng)線程資源耗盡,需檢查線程數(shù)限制、使用線程池、調(diào)整棧大??;4.GCoverheadlimitexceeded指GC頻繁但回收少,應(yīng)分析GC日誌,優(yōu)化

Python Pytest夾具示例 Python Pytest夾具示例 Jul 31, 2025 am 09:35 AM

fixture是用於為測試提供預(yù)設(shè)環(huán)境或數(shù)據(jù)的函數(shù),1.使用@pytest.fixture裝飾器定義fixture;2.在測試函數(shù)中以參數(shù)形式註入fixture;3.yield之前執(zhí)行setup,之後執(zhí)行teardown;4.通過scope參數(shù)控製作用域,如function、module等;5.將共用fixture放在conftest.py中實(shí)現(xiàn)跨文件共享,從而提升測試的可維護(hù)性和復(fù)用性。

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時(shí)間;3.使用of()方法創(chuàng)建特定日期時(shí)間;4.利用plus/minus方法不可變地增減時(shí)間;5.使用ZonedDateTime和ZoneId處理時(shí)區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時(shí)通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

See all articles