使用JUC实现定时任务

Posted niugang0920

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用JUC实现定时任务相关的知识,希望对你有一定的参考价值。

第一种:使用Executors.newScheduledThreadPool实现定时任务

这种实现方式是阿里规范不推荐的使用方式,有资源耗尽的风险

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;

import static java.util.concurrent.TimeUnit.SECONDS;

/**
 * @author Created by niugang on 2019/10/17/14:40
 */
public class ScheduledExecutorTest {

    public static void main(String[] args) {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

        final Runnable beeper = new Runnable() {
            @Override
            public void run() {
                System.out.println("beep");
            }
        };
        /**
         * initialDelay:首次执行延迟的时间
         * period:连续执行之间的一段时间
         */
        final ScheduledFuture<?> beeperHandle =
                scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);

        scheduler.schedule(new Runnable() {

            @Override
            public void run() {
                System.out.println("任务取消了");
                beeperHandle.cancel(true);
            }
        }, 60, SECONDS);
    }
}

第二种:使用ScheduledThreadPoolExecutor实现定时任务

推荐的方式

import com.google.common.util.concurrent.ThreadFactoryBuilder;

import java.util.Date;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @author Created by niugang on 2019/10/17/15:10
 */
public class ScheduledThreadPoolTest {

 
    private static ScheduledThreadPoolExecutor executor;

    static {
        executor = new ScheduledThreadPoolExecutor(5, new ThreadFactoryBuilder()
                .setNameFormat("Scheduled-thread").build());

    }

    public static void main(String[] args) {
        ScheduledFuture<?> scheduledFuture = executor.scheduleAtFixedRate(
                new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Execute work task:" + new Date());
                    }
                }  , 10, 10, TimeUnit.SECONDS);
        System.out.println(scheduledFuture.isCancelled());
         //scheduledFuture.isDone() 如果此任务已完成,则返回true。完成可能是由于正常的终止、异常或取消——在所有这些情况下,此方法都将返回true。
        //scheduledFuture.isCancelled()) 如果此任务在正常完成之前被取消,则返回true
        executor.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("取消任务");
                //尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。
                scheduledFuture.cancel(true);
                System.out.println(scheduledFuture.isCancelled());
            }
        }, 60, TimeUnit.SECONDS);


    }


}

第三种:SpringBoot中定时任务的创建方式

方式一:使用spring提供的注解
方式二:基于ThreadPoolTaskScheduler
@SpringBootApplication
@Slf4j
public class DemoApplication implements ApplicationRunner {

    @Autowired
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    @Override
    public void run(ApplicationArguments args) {

        threadPoolTaskScheduler.scheduleAtFixedRate(() -> log.info("SPRING BOOT SCHEDULE"), new Date(),5000);
    }

    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        return new ThreadPoolTaskScheduler();
    }
}

第四种:使用Quartz

先使用jdk自带的,如果满足不了在使用spring提供的,如果在还满足不了可以借助三方插件

微信公众号

技术图片
JAVA程序猿成长之路
分享资源,记录程序猿成长点滴。专注于Java,Spring,SpringBoot,SpringCloud,分布式,微服务。

以上是关于使用JUC实现定时任务的主要内容,如果未能解决你的问题,请参考以下文章

JUC回顾之-ScheduledThreadPoolExecutor底层实现原理和应用

JUC并发编程 共享模式之工具 ThreadPoolExecutor -- 任务调度线程池 定时任务 / 延时执行(ScheduledThreadPoolExecutor 延时执行 / 定时执行)(代

JUC并发编程 共享模式之工具 ThreadPoolExecutor -- 线程池应用之定时任务(在每周周四执行定时任务)

通俗易懂的JUC源码剖析-ScheduledThreadPoolExecutor

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

任务调度(02)Spring Schedule