JAVA编码(63)—— ScheduledExecutorService 定时器用法

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("您好...");
    }
}

 

posted @ 2018-05-07 16:23  xu_shuyi  阅读(244)  评论(0)    收藏  举报