循环任务
在实际开发过程中,很多时候会用到循环任务,且要求有稳定的执行间隔时间;本示例里使用心跳作为演示示例;
上代码
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.*;
public class BeatService {
//延迟执行时间
int delay = 5000;
//延时单位
TimeUnit delayTimeUnit = TimeUnit.MILLISECONDS;
//线程池
ScheduledExecutorService scheduledExecutor = null;
public BeatService() {
scheduledExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
//定义为守护线程
thread.setDaemon(true);
//线程命名
thread.setName("com.wenjs.executor.bate.service.sender");
return thread;
}
});
}
public void bate(BeatInfo info) {
scheduledExecutor.schedule(new BeatTask(info), delay, delayTimeUnit);
}
class BeatTask implements Runnable {
BeatInfo beatInfo;
public BeatTask(BeatInfo beatInfo) {
this.beatInfo = beatInfo;
}
@Override
public void run() {
System.out.println(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) +
"->" + Thread.currentThread().getName() + ":" + beatInfo.getName());
// todo 发送心跳业务
//重新加入线程池
// BeatService.this.scheduledExecutor.schedule(BeatService.this.new BeatTask(this.beatInfo), delay, delayTimeUnit);
BeatService.this.scheduledExecutor.schedule(this, delay, delayTimeUnit);
}
}
public static void main(String[] args) throws IOException {
BeatService beatService = new BeatService();
BeatInfo beatInfo = new BeatInfo();
beatInfo.setName("beat-test");
beatService.bate(beatInfo);
System.in.read();
}
}
执行结果
2021-08-18 15:54:39->com.wenjs.executor.bate.service.sender:beat-test
2021-08-18 15:54:44->com.wenjs.executor.bate.service.sender:beat-test
2021-08-18 15:54:49->com.wenjs.executor.bate.service.sender:beat-test
本示例中,使用延时线程池的延时功能,每次执行完业务代码后,重新发起新的任务。
结束语:大神勿喷,请多多提建议!