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---------
微信分享/微信扫码阅读
微信分享/微信扫码阅读