package com.sinosoft.common.timer;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;
/**
* Created by xushuyi on 2018/5/7.
*/
public class ScheduledTest {
/**
* 定义8个线程池
*/
private static ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(
8, new BasicThreadFactory.Builder().namingPattern("schedule-pool-8").daemon(true).build());
/**
* 开始进入主方法测试
*
* @param args 参数
*/
public static void main(String[] args) {
/**
* initialDelay:启动等待时间 ,0 表示直接运行
* period:代表多长时间 轮询
* TimeUnit.SECONDS:时间单位(秒S)
*/
// final ScheduledFuture<?> future = scheduledExecutorService.scheduleAtFixedRate(
// new RunnableTest(), 0, 2, TimeUnit.SECONDS);
// new Thread(new Runnable() {
// @Override
// public void run() {
// try {
// future.get();
// } catch (InterruptedException e) {
// e.printStackTrace();
// future.cancel(false); // 关闭线程
// } catch (ExecutionException e) {
// e.printStackTrace();
// future.cancel(false); // 关闭线程
// }
// }
// }).start();
/**
* 如果需要在特定时间进行执行,则需要进行时间计算
*/
Long currentTime = System.currentTimeMillis();
List<Long> delayTimeList = new ArrayList<Long>();
// 指定每天的 16:10:00 进行一次调度
Long delayTime1 = delayTime(currentTime, "16:18:10");
// 指定每天的 16:10:30 进行一次调度
Long delayTime2 = delayTime(currentTime, "16:18:30");
delayTimeList.add(delayTime1);
delayTimeList.add(delayTime2);
// 开始一个任务调度
// final ScheduledFuture<?> future = scheduledExecutorService.scheduleAtFixedRate(new RunnableTest(), delayTime / 1000, 1,
// TimeUnit.SECONDS);
// for (Long delayTime : delayTimeList) {
// // 事件每隔一天 在指定的时间轮询一次
// final ScheduledFuture<?> future = scheduledExecutorService.scheduleAtFixedRate(new RunnableTest(), delayTime / 1000, 24 * 60 * 60, TimeUnit.SECONDS);
// new Thread(new Runnable() {
// @Override
// public void run() {
// try {
// future.get();
// } catch (InterruptedException e) {
// e.printStackTrace();
// future.cancel(false); // 关闭线程
// } catch (ExecutionException e) {
// e.printStackTrace();
// future.cancel(false); // 关闭线程
// }
// }
// }).start();
// }
for (Long delayTime : delayTimeList) {
// 任务再指定的时间轮询一次 就关闭了
final ScheduledFuture<?> future = scheduledExecutorService.schedule(new RunnableTest(), delayTime / 1000, TimeUnit.SECONDS);
new Thread(new Runnable() {
@Override
public void run() {
try {
future.get();
} catch (InterruptedException e) {
e.printStackTrace();
future.cancel(false); // 关闭线程
} catch (ExecutionException e) {
e.printStackTrace();
future.cancel(false); // 关闭线程
}
}
}).start();
}
}
/**
* 计算延时时间
*
* @param currentTime 当前的系统时间
* @param campareDateStr 指定启动定时任务时间
* @return
*/
private static long delayTime(long currentTime, String campareDateStr) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date();
Calendar calendar = Calendar.getInstance();
// 获取当天的年月日 + 需要启动的日期
String str = calendar.get(Calendar.YEAR)
+ "-"
+ (calendar.get(Calendar.MONTH) + 1)
+ "-"
+ calendar.get(Calendar.DATE)
+ " "
+ campareDateStr;
try {
date = sdf.parse(str);
} catch (ParseException e1) {
e1.printStackTrace();
}
long dateMillis = date.getTime();
return dateMillis - currentTime;
}
}
class RunnableTest implements Runnable {
@Override
public void run() {
System.out.println("您好...");
}
}