java周期调度几种实现

写代码的时候有些任务需要做周期处理,例如每天9点解析文件并落地到数据库。这时候就需要选择合适的任务调度策略。以下是java里常用的几个任务调度方法:

1、java.util.Timer, java.util.TimerTask
timer启动一个异步线程执行任务,周期执行任务策略对应方法scheduleAtFixedRate(TimerTask task, long delay, long period),scheduleAtFixedRate(TimerTask task, Date firstTime, long period)可以指定首次任务时间和周期间隔时间。停止任务执行使用cancel()。
Timer执行任务是单线程的,内部用任务队列来维护待执行任务,任务使用最小堆算法排序(任务下次执行时间距今越小越优先被执行),添加任务时使用锁机制防止并发问题。但是如果自定义的任务处理逻辑包含访问竞争资源,则需要自己进行相关竞争资源的防并发处理。

示例代码如下:

        final Timer timer = new Timer();
        final AtomicInteger taskExecuteCnt = new AtomicInteger();

        TimerTask timerTaskA = new TimerTask() {
            @Override
            public void run() {
                // scheduler work content
                if (taskExecuteCnt.get() >= 10) {
                    timer.cancel();
                }

                System.out.printf("Task A execute,current time:%s\n", new Date());
                taskExecuteCnt.incrementAndGet();
            }
        };

        TimerTask timerTaskB = new TimerTask() {
            @Override
            public void run() {
                // scheduler work content
                if (taskExecuteCnt.get() >= 10) {
                    timer.cancel();
                }

                System.out.printf("Task B execute,current time:%s\n", new Date());
                taskExecuteCnt.incrementAndGet();
            }
        };

        timer.scheduleAtFixedRate(timerTaskA, 0, 500);
        timer.scheduleAtFixedRate(timerTaskB, 0, 500);

执行后结果:
Task A execute,current time:Mon Sep 28 14:08:21 CST 2015
Task B execute,current time:Mon Sep 28 14:08:21 CST 2015
Task B execute,current time:Mon Sep 28 14:08:22 CST 2015
Task A exe
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java提供了四种线程池,分别是:FixedThreadPool、CachedThreadPool、ScheduledThreadPool和SingleThreadPool。 1. FixedThreadPool(固定大小线程池):该线程池会预先创建指定数量的线程,当有任务提交时,若有空闲线程则立即执行,若无空闲线程则任务进入等待队列,直到有空闲线程。该线程池适用于执行长期的任务。 2. CachedThreadPool(缓存线程池):该线程池会根据需要动态创建线程,如果有空闲线程可用,则立即执行任务,如果没有可用线程,则新建线程。当线程60秒钟不执行任务时,会被终止并从线程池中移除,保持线程池的大小在合理范围内。该线程池适用于执行大量的短期任务。 3. ScheduledThreadPool(定时任务线程池):该线程池用于执行定时任务和周期性任务。它可以根据需要预定执行任务,并保证任务按照预定的时间执行。该线程池适用于需要定时执行任务的场景。 4. SingleThreadPool(单线程池):该线程池只有一个线程在工作,所有任务按照顺序执行。如果当前线程发生异常退出,则会创建一个新的线程来替代。该线程池适用于需要顺序执行任务的场景。 通过使用这四种线程池,可以根据实际需求来合理管理和调度线程,提高系统的性能和资源利用率。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java并发编程中四种线程池](https://blog.csdn.net/riemann_/article/details/97617432)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值