项目需要一个可嵌入到指定代码位置的定时任务类,写了一个单纯的定时任务类,实现了异步执行,定时执行,超时处理的功能。主要使用了JUC相关技术。
执行一次任务,超时将强制关闭:
/**
* 执行一次任务,超时将强制关闭
* @param jobName 线程名称
* @param job 具体执行的方法
* @param timeOut 超时时间
* @param shutDownTimeOut 超时关闭时间
* @param shutDownNowTimeOut 立刻关闭时间
* @param timeUnit 时间单位
*/
public static void doJobTimeOut (
String jobName,
Runnable job,
int timeOut,
int shutDownTimeOut,
int shutDownNowTimeOut,
TimeUnit timeUnit
){
//定义线程执行开始时间,统计性能用
long startTime = System.currentTimeMillis();
//使用ThreadFactory,方便以后统一在创建线程时设置一些参数
ThreadFactory threadFactory = jobName == null ? DEFAULT_JOB_THREAD : r -> new Thread(r,String.format(prefix+"%s",jobName));
//获取一个容量为1的线程池
ExecutorService pool = Executors.newSingleThreadExecutor(threadFactory);
//执行指定的线程任务,并且在此拦截线程业务处理异常信息
//Future future = executorService.submit(job);
Future<?> future = pool.submit(() ->{
try {
job.run();
} catch (Exception e) {
LOG.error("job error",e);
}
});
try {
//如果需要等待最多在给定的时间计算完成,然后检索其结果(如果可用)
future.get(timeOut,timeUnit);
} cat