1、使用線程
2、使用Timer類
3、使用ScheduledExecutorService類
4、使用Quartz
5、使用spring的@Scheduled注解
6、cron表達式
- 線程實現(xiàn)
利用線程可以設(shè)定休眠時間的方式可以實現(xiàn)簡單的定時任務(wù)邏輯。
public static void main(String[] args){
//定時任務(wù)間隔時間
int sleepTime=2*1000;
new Thread(new Runnable() {
@Override
public void run() {
while (true){
try {
System.out.println("Thread方式執(zhí)行一次定時任務(wù)");
//線程休眠規(guī)定時間
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
- Timer類
Timer類允許調(diào)度一個TimerTask任務(wù)。使用這種方式可以讓你的程序按照某一個頻度執(zhí)行。
public static void main(String[] args){
int sleepTime=2*1000;
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("Timer方式執(zhí)行一次定時任務(wù)");
}
};
new Timer().schedule(timerTask,1,sleepTime);
}
- ScheduledExecutorService類
ScheduledExecutorService,是基于線程池設(shè)計的定時任務(wù)類,每個調(diào)度任務(wù)都會分配到線程池中的一個線程去執(zhí)行,也就是說,任務(wù)是并發(fā)執(zhí)行,互不影響。
因此,基于ScheduledExecutorService類的定時任務(wù)類,歸根到底也是基于線程的調(diào)度實現(xiàn)的。
public static void main(String[] args){
int sleepTime=2*1000;
ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
scheduledExecutor.scheduleAtFixedRate(
new Runnable() {
@Override
public void run() {
System.out.println("ScheduledExecutorService方式執(zhí)行一次定時任務(wù)");
}
}
,1,sleepTime, TimeUnit.SECONDS);
}
- 整合Quartz
Quartz是一個完全由Java編寫的開源作業(yè)調(diào)度框架,為在 Java 應(yīng)用程序中進行作業(yè)調(diào)度提供了簡單卻強大的機制,要理解它的使用方式,需要先理解它的幾個核心概念:
Job: 表示一個工作,要執(zhí)行的具體內(nèi)容。此接口中只有一個方法,如下:
void execute(JobExecutionContext context)
JobDetail: 表示一個具體的可執(zhí)行的調(diào)度程序,Job 是這個可執(zhí)行程調(diào)度程序所要執(zhí)行的內(nèi)容,另外 JobDetail 還包含了這個任務(wù)調(diào)度的方案和策略。
Trigger: 代表一個調(diào)度參數(shù)的配置,什么時候去調(diào)。
Scheduler: 代表一個調(diào)度容器,一個調(diào)度容器中可以注冊多個 JobDetail 和Trigger。當 Trigger 與 JobDetail 組合,就可以被 Scheduler 容器調(diào)度了。
有了這些概念之后,我們就可以把Quartz整合到我們的springboot項目中了。
引入quartz依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
配置
@Configuration
public class QuartzConfig {
@Bean
public JobDetail quartzDetail(){
return JobBuilder.newJob(QuartzTest.class).withIdentity("QuartzTest").storeDurably().build();
}
@Bean
public SimpleTrigger quartzTrigger(){
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever();
return TriggerBuilder.newTrigger().forJob(quartzDetail())
.withIdentity("QuartzTest")
.withSchedule(scheduleBuilder)
.build();
}
}
測試
public class QuartzTest extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext){
System.out.println("quartz執(zhí)行一次定時任務(wù) ");
}
}
- 使用Scheduled注解
@Scheduled是spring為定時任務(wù)而生的一個注解
/**
* 開啟定時任務(wù)支持
*/
@EnableScheduling
@Component
public class ScheduledTest {
private Logger logger = LoggerFactory.getLogger(ScheduledTest.class);
/**
* 每15秒執(zhí)行一次定時任務(wù)
*/
@Scheduled(cron = "0/15 * * * * ? ")
public void testCron(){
logger.info("Scheduled 執(zhí)行一次定時任務(wù)");
}
}
- cron表達式
cron表達式是一個字符串其語法為:
[秒] [分] [小時] [日] [月] [周] [年]
其中[年]為非必填項,因此通常cron表達式通常由6或7部分內(nèi)容組成,內(nèi)容的取值為數(shù)字或者一些cron表達式約定的特殊字符,這些特殊字符稱為“通配符”,每一個通配符分別代指一種值。cron表達式可以用這樣的表格來表示:
| 順序 | 取值范圍 | 特殊字符串范圍 |
|---|---|---|
| 秒 | 0~60 | , - * / |
| 分 | 0-60 | , - * / |
| 時 | 0-23 | , - * / |
| 日 | 1-31 | , - * / |
| 月 | 1-12 | / JAN-DEC , - * ? / L W |
| 周 | 1-7 | / SUN-SAT , - * ? / L # |
| 年(可省略) | 1970-2099 | , - * / |
其中通配符的解釋以及作用如下:
| 通配符 | 代表的值 | 解釋 |
|---|---|---|
| * | 所有值 | 如:時字段為*,代表每小時都觸發(fā) |
| ? | 不指定值 | 如:周字段為?,代表表達式不關(guān)心是周幾 |
| - | 區(qū)間 | 如:時字段設(shè)置2-5,代表2,3,4,5點鐘時都觸發(fā) |
| , | 多個值 | 如:時字段設(shè)置2,3,5,代表2,3,5點都會觸發(fā) |
| / | 遞增值 | 如:時字段設(shè)置0/2,代表每兩個小時觸發(fā),時字段設(shè)置 2/5,代表從2時開始每隔5小時觸發(fā)一次 |
| L | 最后值 | 如:日字段設(shè)置L,代表本月最后一天 |
| W | 最近工作日 | 如:在日字段設(shè)置13W,代表沒約13日最近的那個工作日觸發(fā)一次 |
| # | 序號 | 如:在周字段設(shè)置5#2,代表每月的第二個周五 |
示例:
每2秒執(zhí)行一次:0/5 ?
每5分鐘執(zhí)行一次:0 0/5 * ?
1分、12分、45分執(zhí)行一次:0 1,12,45 * ?
每天23點59分59秒執(zhí)行一次:59 59 23 ?
每月15號凌晨3點執(zhí)行一次:0 0 3 15 * ?
每月最后一天12點執(zhí)行一次:0 0 12 L * ?
在線Cron表達式生成器地址:http://qqe2.com/cron