定时关闭while循环
先定义一个开关
private static boolean flag;
设置timer定时运行的任务,用来定时一分钟关闭while循环
private static TimerTask timerTask; //传值true表示Timer线程为守护线程,主线程结束跟随结束,默认false Timer timer = new Timer(true); 实际上就是一个Runnable timerTask = new TimerTask() { @Override public void run() { flag = false; timerTask.cancel(); timer.cancel(); timer.purge(); } };timer.schedule(timerTask,60*1000);
while (flag) {//业务实现...
}
timer.schedule(timerTask,60*1000);
60秒后执行一次
timer.schedule(timerTask,10*1000,60*1000);
10秒后执行第一次,然后每隔60秒执行一次。
可用Calendar 设置时间
Calendar calendar = new GregorianCalendar();
calendar.add(Calendar.SECOND, 5);
Date runDate = calendar.getTime();
MyTask myTask = new MyTask();
Timer timer = new Timer();
timer.schedule(myTask, runDate);
class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("MyTask运行时间:" + new Date());
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Timer常用方法
schedule(TimerTask task, long delay);//指定任务task,在delay毫秒延迟后执行
schedule(TimerTask task, Date time);//指定任务task,在time时间点执行一次
schedule(TimerTask task, long delay, long period);//指定任务task,延迟delay毫秒后执行第一次,并在之后每隔period毫秒执行一次
schedule(TimerTask task, Date firstTime, long period);//指定任务task,在firstTime的时候执行第一次,之后每隔period毫秒执行一次
scheduleAtFixedRate(TimerTask task, long delay, long period);//作用与schedule一致
scheduleAtFixedRate(TimerTask task, Date firstTime, long period);//作用与schedule一致
实际上最后都会使用sched(TimerTask task, long time, long period);//即指定任务task,在time执行第一次,之后每隔period毫秒执行一次
schedule使用系统时间计算下一次,即System.currentTimeMillis()+period
而scheduleAtFixedRate使用本次预计时间计算下一次,即time + period
对于耗时任务,两者区别较大,请按需求选择,瞬时任务无区别。
简单Thread.sleep()实现延迟
new Thread(() -> {
while (count < 10) {
System.out.println(new Date().toString() + ": " + count);
count++;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
线程池
threadPool.execute(() -> {
while (count < 10) {
System.out.println(new Date().toString() + ": " + count);
count++;
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
使用ScheduledTask
//设置间隔时间,每2秒执行一次
taskScheduler.scheduleAtFixedRate(() -> {
System.out.println(new Date().toString() + ": " + count+"设置间隔时间2秒");
count++;
}, 2000);
//可以用Cron表达式,每天凌晨1点执行
taskScheduler.schedule(() -> {
System.out.println(new Date().toString() + ": " + count+"凌晨1点执行");
count++;
}, new CronTrigger("0 0 1 * * ?"));
corn表达式生成地址:https://cron.qqe2.com/
//设置间隔时间,每5.5秒执行一次
taskScheduler.scheduleAtFixedRate(() -> {
System.out.println(new Date().toString() + ": " + count+"设置间隔时间5.5秒");
count++;
}, 5500);
Quartz
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
//创建定时任务的对象
public class MyQuartz implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
Date date = new Date();
String format = new SimpleDateFormat("yy-MM-dd HH-mm-ss").format(date);
System.out.println("======响应时间为:"+format);
}
}
//创建执行类
@Component
public class MySchedule {
public MySchedule() throws SchedulerException {
doQ();
}
public void doQ() throws SchedulerException {
//1、调度器Scheduler的创建
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
//2、创建JobDetail实例,并绑定执行类
JobDetail job = JobBuilder.newJob(MyQuartz.class).withIdentity("Quartz1", "QuartzGroup1").build();
//3、构建Trigger实例
CronTrigger build = TriggerBuilder.newTrigger().withIdentity("Trigger1", "QuartzTrigger1")
.startNow()
//corn表达式指,2秒后开始执行,每3秒执行一次。
.withSchedule(CronScheduleBuilder.cronSchedule("2/3 * * * * ? *"))
.build();
//4、执行Quartz
scheduler.scheduleJob(job,build);
scheduler.start();
}
//5.利用TimeUnit实现延时操作
TimeUnit.SECONDS.sleep(30);
//6.关闭定时任务
scheduler.shutdown();
System.out.println("定时任务结束!");