Java牌定时器

Table of Contents generated with DocToc

ScheduledExecutorService

JUC包中提供的任务线程池类,可以完成定时器任务,但是使用范围比较狭窄,无法提供像Cron那种强大的定时器语义。

		@Test
    public void queueTaskInMultiTread() throws Exception {
        // 核心线程池大小设置为1,则所有任务变成串行。且只有当上一个任务完成后,才会进行下一次任务。
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
        Runnable printA = new ThreadTask("A");
        Runnable printB = new ThreadTask("B");
        ScheduledFuture futureA = scheduler.scheduleAtFixedRate(printA, 0, 5, TimeUnit.SECONDS);
        ScheduledFuture futureB = scheduler.scheduleAtFixedRate(printB, 0, 5, TimeUnit.SECONDS);
        Thread.sleep(10000);

        //删除futureA
        futureA.cancel(true);
        System.out.println("================");
        Thread.sleep(10000);

        //添加任务C
        Runnable printC = new ThreadTask("C");
        System.out.println("================");
        ScheduledFuture futureC = scheduler.scheduleAtFixedRate(printC, 0, 5, TimeUnit.SECONDS);
        Thread.sleep(10000);
        System.out.println("================");

        System.out.println("shutdown runnables: " + scheduler.shutdownNow());
    }

通过ScheduledExecutorService提供的接口,可以完成任务的执行、延迟执行、周期执行,任务的取消等操作,对于简单场景的定时任务可以胜任,但是如果碰到像“每天早上8点执行”这种定时任务,实现起来就比较丑了。