spring

本文记录学习spring boot的任务。随意写的,没有整体性,只是自己备忘用。

原文地址: SpringBoot几种定时任务的实现方式

定时任务实现的几种方式:

  • Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
  • ScheduledExecutorService:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。<!--more-->
  • Spring Task:Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
  • Quartz:这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。

写的一个简单的实现多线程的例子,使用的是Runnable接口。加入了同步锁。

package com.xiaomi.youpin.jd.modular.system.task;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

@Service
public class UserStatTask implements Runnable {

    private static Logger logger = LoggerFactory.getLogger(UserStatTask.class.getName());

    private static Lock lock = new ReentrantLock();

    private Integer count = 10;

    @Override
    public void run() {
        try {
            while (count > 0) {
                Thread.sleep(500);
                lock.lock();
                logger.error(String.format("目前剩下的张数为:%d. 线程id:%d",count,Thread.currentThread().getId()));
                System.out.print(String.format("目前剩下的张数为:%d. 线程id:%d",count,Thread.currentThread().getId()));
                --count;
                lock.unlock();
                Thread.sleep(1000);
            }
        }catch (InterruptedException e)
        {
            logger.error(e.getMessage());
        }
    }



    public void runTask() {
        new Thread(this).start();
        new Thread(this).start();
        new Thread(this).start();
    }

}

--------EOF---------
微信分享/微信扫码阅读