循环任务设计思路

循环任务

在实际开发过程中,很多时候会用到循环任务,且要求有稳定的执行间隔时间;本示例里使用心跳作为演示示例;

上代码

 
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
 

本示例中,使用延时线程池的延时功能,每次执行完业务代码后,重新发起新的任务。

结束语:大神勿喷,请多多提建议!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值