package com.dy.common.util;
|
|
import java.util.Timer;
|
import java.util.TimerTask;
|
|
/**
|
* @Author: liurunyu
|
* @Date: 2024/11/20 17:49
|
* @Description :
|
* 2024-11-20:
|
* 此抽象类代替ThreadJob,原因:
|
* 在while(true){}中使用Thread.sleep(),可能导致的严重性能问题,不推荐在循环中使用线程休眠。
|
* Java线程实现采用内核线程实现,线程的休眠及唤醒(状态切换)需借助操作系统进行,这是一个极其耗时耗力的操作。
|
* 在线程休眠或运行时间较长的情景下,其对性能的影响还不算明显,因为对线程状态的切换并不频繁。
|
* 但若线程休眠及运行的时间都很短(例如毫秒/秒),
|
* 系统将频繁的对线程状态进行切换,导致严重的性能损耗,并对着循环次数的递增而放大。
|
*/
|
public abstract class TimerTaskJob {
|
protected Timer timer;
|
|
protected boolean stop = false ;
|
public void stop(){
|
this.stop = true ;
|
if(this.timer != null){
|
this.timer.cancel();
|
}
|
}
|
public boolean isStop(){
|
return this.stop ;
|
}
|
|
/**
|
*
|
* @param delay
|
* @param interval
|
* @param callback
|
* @throws Exception
|
*/
|
public void start(Long delay, Long interval, Callback callback) throws Exception {
|
this.timer = new Timer();
|
this.timer.schedule(new TimerTask() {
|
public void run() {
|
Exception exe = null ;
|
Object obj = null ;
|
try {
|
obj = execute() ;
|
}catch(Exception e){
|
e.printStackTrace();
|
exe = e ;
|
}finally {
|
if(callback != null){
|
if(exe != null){
|
callback.exception(exe);
|
}else{
|
callback.call(obj);
|
}
|
}
|
}
|
}
|
}, delay , interval);
|
}
|
public abstract Object execute() throws Exception ;
|
}
|