“兄弟们,给我仔细的搜,搜出来一个,老子赏大洋五十!”排长的一个月军饷估计也就这个数,为了能够出这口气,他打算不要这个月的军饷了。

祝融见悟空承认,竟不知再说什么是好,抿抿嘴唇看了看大禹。大禹知道祝融心意,故意扭头望向远山,却不理她。祝融白了大禹一眼,问悟空道:“你会救我们吗?”悟空笑着点头道:“会。”

单双最多连开多少期

“然也。”众位青城剑派长老同时点点头,用一种不置信的眼神看着宁丝竹。
经过近一个半月的行军,哈曼终于率大军抵达了阿姆河,这时逃回了几名败兵,哈曼便知道了唐军占领花剌子模的消息,同时也知道了花剌子模的唐军主帅,正是李庆安。

“哦,那算了。”紫妍有点可惜不过却没放在心上,转身回去继续嗑药。

springtask 定时任务


Java开发过程中经常会遇到使用定时任务的情况,我总结了一下有如下四种方式:Timer、ScheduledExecutorService、SpringTask、Quartz。

一、使用java的Timer

1、Timer

new Timer("testTimer").schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("TimerTask");
            }
        }, 1000,2000);

解释:1000ms是延迟启动时间,2000ms是定时任务周期,每2s执行一次

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
try {
    Date date = dateFormat.parse("2018-07-11 12:00:00.000");
    new Timer("testTimer1").scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            System.out.println("TimerTask");
        }
    }, date,2000);
} catch (ParseException e) {
    e.printStackTrace();
}

解释:date是开始时间,2000ms是定时任务周期,每2s执行一次
timer有2中方法schedule和scheduleAtFixedRate,前者会等任务结束在开始计算时间间隔,后者是在任务开始就计算时间,有并发的情况

二、使用ScheduledExecutorService

1、ScheduledExecutorService

scheduledExecutorService.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("ScheduledTask");
            }
        },1, TimeUnit.SECONDS);

解释:延迟1s启动,执行一次

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("ScheduledTask");
            }
        }, 1, 1, TimeUnit.SECONDS);

解释:延迟1s启动,每隔1s执行一次,是前一个任务开始时就开始计算时间间隔,但是会等上一个任务结束在开始下一个

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
        scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.println("ScheduledTask");
            }
        }, 1, 1, TimeUnit.SECONDS);

解释:延迟1s启动,在前一个任务执行完成之后,延迟1s在执行

三、使用SpringTask

1、写任务类

package com.zb.timedtask;
import com.zb.controller.StudentController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class SpringTask {
    private static final Logger log = LoggerFactory.getLogger(SpringTask.class);

    @Scheduled(cron = "1/5 * * * * *")
    public void task1(){
        log.info("springtask 定时任务!");
    }
    
    @Scheduled(initialDelay = 1000,fixedRate = 1*1000)
    public void task2(){
        log.info("springtask 定时任务!");
    }
}

解释:
task1是每隔5s执行一次,{秒} {分} {时} {日期} 02 {星期}
task2是延迟1s,每隔1S执行一次

2、配置文件修改

(1)简单版

<task:annotation-driven/>

(2)任务池版

<task:executor id="executor" pool-size="10" />
<task:scheduler id="scheduler" pool-size="10" />
<task:annotation-driven executor="executor" scheduler="scheduler" />

(3)解释

假如只有一个定时任务,可以用简单版;如果有多个定时任务,则要用任务池,不然它会顺序执行。

两个任务的时间间隔为:执行时间+设定的定时间隔

例子:(这个任务8s执行一次)

@Scheduled(cron = "1/4 * * * * *")
public void task2(){
    log.info("springtask 定时任务2!");
    try {
        TimeUnit.SECONDS.sleep(4);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

四、使用Quartz框架

1、加依赖

<!-- quartz -->
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.3.0</version>
</dependency>
<!--调度器核心包-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.3.4.RELEASE</version>
</dependency>

2、Job实现

package com.zb.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class HelloWorldJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
        System.out.println( strTime + ":Hello World!");
    }
}

3、调度器(可以用listener在项目启动时执行)

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class MyScheduler {
    public static void main(String[] args) throws SchedulerException {
        //创建调度器Schedule
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        //创建JobDetail实例,并与HelloWordlJob类绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
                .build();
        //创建触发器Trigger实例(立即执行,每隔1S执行一次)
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "triggerGroup1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
                .build();
        //开始执行
        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();
    }
}

解释:上面用的是简单触发器,也可以用Con触发器,如下

Trigger cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger2", "triggerGroup2")
                .startNow()
                .withSchedule(cronSchedule("0 42 10 * * ?"))
                .build();

4、整合spring

也可以直接把上面的调度器写成配置文件,整合spring

(1)job

package com.zb.quartz;
import java.text.SimpleDateFormat;
import java.util.Date;

public class QuarFirstJob {
    public void first() {
        String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
        System.out.println( strTime + ":Hello World!");
    }
}

(2)配置文件

<bean id="QuarFirstJob" class="com.zb.quartz.QuarFirstJob" />

<bean id="jobDetail"
      class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="group" value="quartzGroup1" />
    <property name="name" value="quartzJob1" />
    <!--false表示等上一个任务执行完后再开启新的任务 -->
    <property name="concurrent" value="false" />
    <property name="targetObject">
        <ref bean="QuarFirstJob" />
    </property>
    <property name="targetMethod">
        <value>first</value>
    </property>
</bean>

<!-- 调度触发器 -->
<bean id="myTrigger"
      class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="name" value="trigger1" />
    <property name="group" value="group1" />
    <property name="jobDetail">
        <ref bean="jobDetail" />
    </property>
    <property name="cronExpression">
        <value>0/5 * * * * ?</value>
    </property>
</bean>

<!-- 调度工厂 -->
<bean id="scheduler"
      class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="myTrigger" />
        </list>
    </property>
</bean>

5、时间

public class QuarFirstJob {
    public void first() {
        try {
            TimeUnit.SECONDS.sleep(6);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
        System.out.println( strTime + ":Hello World!");
    }
}

上面的配置里面写是5s间隔,把上面的sleep时间分别改成4和6,发现两次任务间隔是执行时间和间隔时间的最大值,分别是5,6

总结

Quartz是执行时间和间隔时间的最大值(比如;执行时间是3s,间隔是2s,则每3s执行一次;执行时间是3s,间隔是5s,则每5s执行一次。)
Spring task是执行时间+间隔时间(比如;执行时间是3s,间隔是2s,则每5s执行一次;执行时间是3s,间隔是5s,则每8s执行一次。)
timer有2中方法schedule和scheduleAtFixedRate,前者会等任务结束在开始计算时间间隔,后者是在任务开始就计算时间,有并发的情况
ScheduledExecutorService的scheduleAtFixedRate类似Quartz,scheduleWithFixedDelay类似SpringTask

当前文章:http://hnhdqp.com/news_21252.html

发布时间:2019-02-24 00:45:16

大胡棋牌游戏官方下载 欢乐斗牛修改器安卓版 今晚买什么码 欢乐棋牌官方下载 玩扑克牌的技巧 有限德州扑克玩法 杭州棋牌58同城转让 网上打鱼游戏平台

编辑:平宗

相关新闻

“为客户保密”不是银行的天条

2019-02-24 02:48:58

阿拉尔沽航号食品有限公司

12315互联网平台上线 消费维权进入互联网时代

2019-02-24 07:23:40

沧州敝驹传媒广告有限公司

孙家岔派出所召开行业场所安全工作管理会议

2019-02-24 05:58:45

乐清烧履追网络科技

戴尔再发力比特币矿业 徐明星:跨境支付是方向

2019-02-24 06:29:59

吉林谡少掷企业管理有限公司

热门推荐

  • 杭州市旅委大力推进旅游行业文明诚信建设
  • "你是风儿我是沙"还唱呢?你车被砸了!
  • 雷声响过,微信双开解决了谁的刚需?
  • 仅需六招,GPA成绩单即可让面试官眼前一亮
  • ChaseDream Steven :择校如“相亲”知己知彼
  • G级Limited Edition官图 2018年1月上市
  • 【游泳赛事】2017年全国公开水域游泳系列赛(花亭湖站)
  • 漫改真人剧《你已藏在我心底》公布 吉冈里帆主演
  • 急需用钱怎么办?几大方式让你体面借钱
  • 长征五号遥二火箭垂直转运至发射区 择机发射
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:衢州星空棋牌游戏大厅 微信捕鱼兑换现金
  • 熊猫麻将作弊器真的吗 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • 友趣棋牌官网下载 微信安装 朱雀棋牌怎么停服了 左右棋牌有几种型号