## Java专题十六:定时任务
[TOC]
注意测试这些类时应该在主线程总执行,即main方法中执行,如果单元测试使用junit测试不出效果
### 16.1. java.lang.Thread类
```java
public class ThreadTest {
public static void main(String[] args){
Runnable beeper = new Runnable() {
public void run() {
while (true){
System.out.println("beep");
try {
/* 执行周期为3s */
Thread.sleep(3 * 1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
};
Thread thread = new Thread(beeper);
thread.start();
}
}
```
### 16.2. java.util.Timer类
```java
import java.util.Timer;
import java.util.TimerTask;
public class TimerTest{
public static void main(String[] args){
Timer timer = new Timer();
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
System.out.println("beep");
}
};
/* 2s后开始执行,执行周期为3s */
timer.scheduleAtFixedRate(timerTask, 2 *1000, 3 * 1000);
}
}
```
### 16.3. java.util.concurrent.ScheduledExecutorService类
```java
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ScheduledExecutorServiceTest{
public static void main(String[] args){
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Runnable beeper = new Runnable() {
public void run() {
System.out.println("beep");
}
};
/* 2s后开始执行,执行周期为3s */
scheduler.scheduleAtFixedRate(beeper, 2, 3, TimeUnit.SECONDS);
}
}
```
### 16.4. 第三方quartz包
1.添加依赖包(gradle)
```
compile 'org.quartz-scheduler:quartz:2.3.0'
compile 'org.slf4j:slf4j-log4j12:1.7.10'
```
除了添加定时任务jar包,还需要添加slf4j 和 log4j整合用的日志文件,详情参考[官网](http://www.quartz-scheduler.org/documentation/quartz-2.2.x/quick-start.html#quartz-quick-start-guide)
2.新建工作类
```java
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class BeepJob implements Job {
public BeepJob(){
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
System.out.println(dataMap.get("msg"));
System.err.println("BeepJob Executed");
}
}
```
3.设置并启动定时器开始执行工作
```java
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory
;import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class ScheduleTest {
public static void main(String[] args){
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = null;
try {
scheduler = sf.getScheduler();
/* 使用JobDetail中的JobDataMap携带数据 */
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("msg", "beep");
JobDataMap jobDataMap = new JobDataMap(dataMap);
/* 定义JobDetail */
JobDetail job = JobBuilder.newJob(BeepJob.class)
.withIdentity("beep-job", "beep")
.usingJobData(jobDataMap)
.build();
/* 定义开始时间 */
Date date = new Date(System.currentTimeMillis() + 2 * 1000);
/* Define a Trigger that will fire "date", and repeat forever, 2s后开始执行,执行周期为3s */
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("beep-trigger", "beep")
.startAt(date)
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(3)
.repeatForever())
.build();
/* Tell quartz to schedule the job using our trigger */
scheduler.scheduleJob(job, trigger);
scheduler.start();
}catch (SchedulerException e){
e.printStackTrace();
}
}
}
```
- JavaCook
- Java专题零:类的继承
- Java专题一:数据类型
- Java专题二:相等与比较
- Java专题三:集合
- Java专题四:异常
- Java专题五:遍历与迭代
- Java专题六:运算符
- Java专题七:正则表达式
- Java专题八:泛型
- Java专题九:反射
- Java专题九(1):反射
- Java专题九(2):动态代理
- Java专题十:日期与时间
- Java专题十一:IO与NIO
- Java专题十一(1):IO
- Java专题十一(2):NIO
- Java专题十二:网络
- Java专题十三:并发编程
- Java专题十三(1):线程与线程池
- Java专题十三(2):线程安全与同步
- Java专题十三(3):内存模型、volatile、ThreadLocal
- Java专题十四:JDBC
- Java专题十五:日志
- Java专题十六:定时任务
- Java专题十七:JavaMail
- Java专题十八:注解
- Java专题十九:浅拷贝与深拷贝
- Java专题二十:设计模式
- Java专题二十一:序列化与反序列化
- 附加专题一:MySQL
- MySQL专题零:简介
- MySQL专题一:安装与连接
- MySQL专题二:DDL与DML语法
- MySQL专题三:工作原理
- MySQL专题四:InnoDB存储引擎
- MySQL专题五:sql优化
- MySQL专题六:数据类型
- 附加专题二:Mybatis
- Mybatis专题零:简介
- Mybatis专题一:配置文件
- Mybatis专题二:映射文件
- Mybatis专题三:动态SQL
- Mybatis专题四:源码解析
- 附加专题三:Web编程
- Web专题零:HTTP协议
- Web专题一:Servlet
- Web专题二:Cookie与Session
- 附加专题四:Redis
- Redis专题一:数据类型
- Redis专题二:事务
- Redis专题三:key的过期
- Redis专题四:消息队列
- Redis专题五:持久化