java定時任務(wù)實現(xiàn)的4種方式小結(jié)
1. java自帶的Timer
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("Time's up!");
}
},3*1000,1000);
2.ScheduledThreadPool-線程池
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println("=========================");
}
}, 1000, 2000, TimeUnit.MILLISECONDS);
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(System.currentTimeMillis()+"<><>"+System.nanoTime());
}
}, 1000, 2000, TimeUnit.MILLISECONDS);
3.使用注解的形式:@Scheduled
@Component
public class SpringScheduled {
@Scheduled(initialDelay = 2000,fixedDelay = 5000)
public void doSomething() {
System.out.println("Spring自帶的Scheduled執(zhí)行了=======================");
}
}
//下面是開啟
@SpringBootApplication
@EnableScheduling
public class DemoApplication {
public static void main(String[] args) throws InterruptedException {
SpringApplication application = new SpringApplication(DemoApplication.class);
application.addListeners(new ContextRefreshedEventListener());
application.run(args);
}
}
4.使用Quartz定時任務(wù)調(diào)度器
配置
@Configuration
public class QuartzConfig {
@Resource
private ScheduleTask scheduleTask;
/**
* 配置定時任務(wù)1
* @return
*/
@Bean(name="firstJobDetail")
public MethodInvokingJobDetailFactoryBean firstJobDetail(){
MethodInvokingJobDetailFactoryBean method = new MethodInvokingJobDetailFactoryBean();
// 為需要執(zhí)行的實體類對應(yīng)的對象
method.setTargetObject(scheduleTask);
// 需要執(zhí)行的方法
method.setTargetMethod("test");
// 是否并發(fā)執(zhí)行
method.setConcurrent(false);
return method;
}
/**
* 配置觸發(fā)器1
* @param firstJobDetail
* @return
*/
@Bean(name="firstTrigger")
public SimpleTriggerFactoryBean firstTrigger(JobDetail firstJobDetail){
SimpleTriggerFactoryBean simpleBean = new SimpleTriggerFactoryBean();
simpleBean.setJobDetail(firstJobDetail);
// 設(shè)置任務(wù)啟動延遲
simpleBean.setStartDelay(1000);
// 每1秒執(zhí)行一次
simpleBean.setRepeatInterval(1000);
//設(shè)置重復(fù)計數(shù)
//simpleBean.setRepeatCount(0);
return simpleBean;
}
/**
* 配置Scheduler
*/
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactoryBean(Trigger firstTrigger){
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
factoryBean.setTriggers(firstTrigger);
return factoryBean;
}
}
要執(zhí)行的任務(wù)
@Component
public class ScheduleTask {
public void test() {
System.out.println("====================================");
}
}
總結(jié):
還有其他方式可以實現(xiàn)定時任務(wù)的方式,可以貼出來,討論討
補充知識:SpringBoot定時任務(wù)簡單使用和自定義開啟關(guān)閉修改周期
一、簡單使用
1.pom加入基本springboot基本的starter即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
2.@Scheduled 參數(shù)可以接受兩種定時的設(shè)置,一種是我們常用的cron="*/6 * * * * ?",一種是 fixedRate = 6000,兩種都表示每隔六秒打印一下內(nèi)容。
fixedRate 說明
@Scheduled(fixedRate = 6000) :上一次開始執(zhí)行時間點之后6秒再執(zhí)行
@Scheduled(fixedDelay = 6000) :上一次執(zhí)行完畢時間點之后6秒再執(zhí)行
@Scheduled(initialDelay=1000, fixedRate=6000) :第一次延遲1秒后執(zhí)行,之后按fixedRate的規(guī)則每6秒執(zhí)行一次
@Component
public class TimingTask {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(cron="*/6 * * * * ?")
private void process(){
System.out.println("this is scheduler task runing "+new Date());
}
@Scheduled(fixedRate = 6000)
public void reportCurrentTime() {
System.out.println("現(xiàn)在時間:" + dateFormat.format(new Date()));
}
}
3.啟動類加上@EnableScheduling注解。
@SpringBootApplication(exclude = MongoAutoConfiguration.class)
@EnableScheduling
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
4.運行結(jié)果
this is scheduler task runing Thu Jul 18 10:59:06 CST 2019 現(xiàn)在時間:10:59:10 this is scheduler task runing Thu Jul 18 10:59:12 CST 2019 現(xiàn)在時間:10:59:16 this is scheduler task runing Thu Jul 18 10:59:18 CST 2019 現(xiàn)在時間:10:59:22 this is scheduler task runing Thu Jul 18 10:59:24 CST 2019 現(xiàn)在時間:10:59:28
以上就是定時任務(wù)的簡單使用。但是有時候,定時任務(wù)需要關(guān)閉,和開啟,或者修改定時任務(wù)的運行周期,可以使用下面的方式實現(xiàn).
二、高級使用,自定義定時任務(wù),關(guān)閉,開啟,修改周期
1.說明
ThreadPoolTaskScheduler:線程池任務(wù)調(diào)度類,能夠開啟線程池進行任務(wù)調(diào)度。
ThreadPoolTaskScheduler.schedule()方法會創(chuàng)建一個定時計劃ScheduledFuture,在這個方法需要添加兩個參數(shù),Runnable(線程接口類) 和CronTrigger(定時任務(wù)觸發(fā)器)
在ScheduledFuture中有一個cancel可以停止定時任務(wù)。
@RestController
@RequestMapping("/time")
public class DynamicScheduledTask {
private static String DEFAULT_CRON = "0/5 * * * * ?";
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private ScheduledFuture<?> future;
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
@RequestMapping("/{id}/startCron")
public String startCron(@PathVariable("id") String id) {
future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger(DEFAULT_CRON));
System.out.println("DynamicTask.startCron()"+"------"+id);
return "startCron";
}
@RequestMapping("/{id}/stopCron")
public String stopCron(@PathVariable("id") String id) {
if (future != null) {
future.cancel(true);
}
System.out.println("DynamicTask.stopCron()"+"------"+id);
return "stopCron";
}
@RequestMapping("/{id}/changeCron10")
public String startCron10(@PathVariable("id") String id) {
stopCron(id);// 先停止,在開啟.
future = threadPoolTaskScheduler.schedule(new MyRunnable(), new CronTrigger("*/10 * * * * *"));
System.out.println("DynamicTask.startCron10()"+"------"+id);
return "changeCron10";
}
private class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("DynamicTask.MyRunnable.run()," + new Date());
}
}
}
如果想,做成后臺管理,添加刪除定時任務(wù),可以將定時任務(wù),持久化到數(shù)據(jù)庫,自定義開發(fā)MyRunnable定時任務(wù)的業(yè)務(wù)類,也持久化到數(shù)據(jù)庫,然后,threadPoolTaskScheduler.schedule要的業(yè)務(wù)類,可通過反射實例化出來,傳遞,然后,通過url,id參數(shù),來開啟,關(guān)閉,刪除,對應(yīng)的定時任務(wù)。
以上這篇java定時任務(wù)實現(xiàn)的4種方式小結(jié)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java利用socket通信實現(xiàn)Modbus-RTU通信協(xié)議的示例代碼
這篇文章主要介紹了java利用socket通信實現(xiàn)Modbus-RTU通信協(xié)議的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
SpringBoot?DataSource數(shù)據(jù)源實現(xiàn)自動配置流程詳解
這篇文章主要介紹了SpringBoot?DataSource數(shù)據(jù)源實現(xiàn)自動配置流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10
利用Java工具類Hutool實現(xiàn)驗證碼校驗功能
這篇文章主要介紹了利用Java工具類Hutool實現(xiàn)驗證碼校驗功能,利用Hutool實現(xiàn)驗證碼校驗,校驗的Servlet與今天的第一篇是一樣的,唯一就是驗證碼的生成是不一樣的,利用Hutool生成驗證碼更快捷.需要的朋友可以參考下2022-10-10
SpringBoot用多線程批量導(dǎo)入數(shù)據(jù)庫實現(xiàn)方法
這篇文章主要介紹了SpringBoot用多線程批量導(dǎo)入數(shù)據(jù)庫實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02
學(xué)習(xí)不同 Java.net 語言中類似的函數(shù)結(jié)構(gòu)
這篇文章主要介紹了學(xué)習(xí)不同 Java.net 語言中類似的函數(shù)結(jié)構(gòu),函數(shù)式編程語言包含多個系列的常見函數(shù)。但開發(fā)人員有時很難在語言之間進行切換,因為熟悉的函數(shù)具有不熟悉的名稱。函數(shù)式語言傾向于基于函數(shù)范例來命名這些常見函數(shù)。,需要的朋友可以參考下2019-06-06
Java常用數(shù)字工具類 數(shù)字轉(zhuǎn)漢字(1)
這篇文章主要為大家詳細介紹了Java常用數(shù)字工具類,數(shù)字轉(zhuǎn)漢字,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05
Java簡單數(shù)據(jù)加密方法DES實現(xiàn)過程解析
這篇文章主要介紹了Java簡單數(shù)據(jù)加密方法DES實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12

