前言
之前有测试
# 启动类加
@EnableAsync
# 方法上加注解
@Async
@PostConstruct
但是依旧会卡主主线程,所有另辟蹊径
第一种
在启动类上加注解
@EnableAsync
新建一个类
实现 ApplicationRunner
并重写 run
因为我们是死循环,所以在 run
方法上额外加一个 @Async
注解即可
例如如下
package com.ruoyi.project.init;
import com.ruoyi.common.utils.MyUtils;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Async;
import javax.annotation.PostConstruct;
@Configuration
public class HandleTransInit implements ApplicationRunner {
/**
* 处理转账数据
*
* @param args
*/
@Override
@Async
public void run(ApplicationArguments args) {
while (true) {
System.out.println("执行");
MyUtils.sleep(1000);
}
}
}
第二种
新建一个类
在类上加注解@Configuration
新建方法,在方法上加注解@PostConstruct
例如代码如下
package com.ruoyi.project.init;
import com.ruoyi.common.utils.MyUtils;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.time.LocalDateTime;
import java.util.TimerTask;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Configuration
public class HandleTransInit11 {
/**
* 处理转账数据
*/
@PostConstruct
public void run() {
//因为我是死循环这个简单的需求,所以线程池容量我就填写1了,如果你有其他需求,可以填大点,然后 scheduleAtFixedRate 方法复制多一点就行了
ScheduledThreadPoolExecutor scheduledThreadPoolExecutor = new ScheduledThreadPoolExecutor(1);
// 下面用的是scheduleAtFixedRate,还有一种是scheduleWithFixedDelay
// 区别
// scheduleAtFixedRate:如果上一个任务的执行时间大于周期时间(period参数),任务结束后,下一个任务马上执行
// scheduleWithFixedDelay:如果上个任务的执行时间大于周期时间(period参数),任务结束后也会等待周期相应的时间才执行下一个任务
// 不管是scheduleAtFixedRate还是scheduleWithFixedDelay,他们都会等待上一个任务运行结束再进行下一个任务,而不是并发执行
scheduledThreadPoolExecutor.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
//System.out.println(Thread.currentThread().getName());
System.out.println("开始" + LocalDateTime.now());
MyUtils.sleep(500);
System.out.println("完成" + LocalDateTime.now());
}
}, 1, 2, TimeUnit.SECONDS);
// 说一下3个参数的含义,
// 第一个参数,要执行的run方法,
// 第二个参数,initialDelay,首次执行等待多久后开始执行,就是容器启动后等待多久后才执行
// 第三个参数,period,周期,首次执行完后,以后每次执行间隔多久执行
// 这里写的period参数为2代表每2秒执行一次
// 如果run方法里的执行时间超过了2秒,那么run方法里执行完后,会立马执行,而不会再次等待2秒
// 如果run方法里的执行时间没有超过2秒,例如用时500毫秒,那么将会延迟1.5秒后继续执行run方法(周期 - run方法耗时 = 1.5秒)
}
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: requestAnimationFrame.js—封装动画Frame51
//主要是区分浏览器的不同,如果浏览器不支持requestNextAnimationFrame()方法,只能使用setTimeout()来代替。这种封装方式称为polyfill method,多平台智能适配方法,主要思想是利用不同平台的优缺点,当不满足时再用替…