定义一个job:ranJob,设置每秒执行一次,设置不允许覆盖并发执行

  1. <bean id="rankJob" class="com.chinacache.www.logstat.job.RankJob" />
  2. <bean id="rankJobDetail"
  3. class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  4. <property name="targetObject" ref="rankJob" />
  5. <property name="targetMethod" value="execute" />
  6. <property name="concurrent" value="<span style="color: #ff0000;"><strong>false</strong></span>" />
  7. </bean>
  8. <bean id="rankJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
  9. <property name="jobDetail" ref="rankJobDetail" />
  10. <!-- 单位 ms,半小时 1800000 ms -->
  11. <property name="repeatInterval" value="<span style="color: #ff0000;"><strong>1000</strong></span>" />
  12. </bean>

job代码:

  1. System.out.println("Start job");
  2. ExecutorService exec = Executors.newFixedThreadPool(1);
  3. Thread thread = new Thread(new Runnable() {
  4. @Override
  5. public void run() {
  6. System.out.println("thread start");
  7. try {
  8. Thread.sleep(3000);
  9. } catch (InterruptedException e) {
  10. // TODO Auto-generated catch block
  11. e.printStackTrace();
  12. }
  13. System.out.println("thread end");
  14. }
  15. });
  16. exec.execute(thread);
  17. System.out.println("end job");

程序输出结果:

  1. Start job
  2. end job
  3. <span style="color: #ff0000;"><strong>thread start</strong></span>
  4. Start job
  5. end job
  6. thread start
  7. Start job
  8. end job
  9. thread start
  10. Start job
  11. end job
  12. thread start
  13. <strong><span style="color: #ff0000;">thread end</span></strong>

从结果可以看到,job的并发覆盖配置似乎根本没有生效,原因是:job没有关注多线程执行情况

修改job代码,添加如下代码在job访问最后,线程处理完job才结束,

  1. while (!exec.isTerminated()) {
  2. // 等待所有子线程结束,才退出主线程
  3. }

修改代码后程序结果:

  1. Start job
  2. thread start
  3. thread end

可以看到job始终没有结束,说明ExecutorService始终没有终止,看看文档,加入shutdonw()方法,job所有代码如下:

  1. public void execute() throws InterruptedException {
  2. System.out.println("Start job");
  3. ExecutorService exec = Executors.newFixedThreadPool(1);
  4. Thread thread = new Thread(new Runnable() {
  5. @Override
  6. public void run() {
  7. System.out.println("thread start");
  8. try {
  9. Thread.sleep(3000);
  10. } catch (InterruptedException e) {
  11. // TODO Auto-generated catch block
  12. e.printStackTrace();
  13. }
  14. System.out.println("thread end");
  15. }
  16. });
  17. exec.execute(thread);
  18. exec.shutdown();
  19. while (!exec.isTerminated()) {
  20. // 等待所有子线程结束,才退出主线程
  21. }
  22. System.out.println("end job");
  23. }

打印结果如下:

  1. Start job
  2. thread start
  3. thread end
  4. end job
  5. Start job
  6. thread start
  7. thread end
  8. end job
  9. Start job
  10. thread start
  11. thread end
  12. end job

OK,至此spring quartz多线程并发问题解决。回顾下,我们要使用isTerminated()方法等多线程结束后在结束job;多线程任务派发结束后,要使用shutdown()方法顺序关闭线程(等待正在执行任务,不接受新任务)

spring quartz使用多线程并发“陷阱”的更多相关文章

  1. spring quartz 配置

    quartz简介 各种企业应用几乎都会碰到任务调度的需求,就拿论坛来说:每隔半个小时生成精华文章的RSS文件,每天凌晨统计论坛用户的积分排名,每隔30分钟执行锁定用户解锁任务.任务调度本身涉及到多线程 ...

  2. Spring Quartz 和 Spring Task使用比较

    Quartz 和 Spring Task执行时间对比: 1. Quartz同步模式:一个任务的两次执行的时间间隔是:“执行时间”和“trigger的设定间隔”的最大值 2. Task默认同步模式:一个 ...

  3. Spring Quartz实现任务调度

    任务调度 在企业级应用中,经常会制定一些"计划任务",即在某个时间点做某件事情 核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作 任务调度涉及多线程并发.线程池维 ...

  4. 基于spring+quartz的分布式定时任务框架

    问题背景 我公司是一个快速发展的创业公司,目前有200人,主要业务是旅游和酒店相关的,应用迭代更新周期比较快,因此,开发人员花费了更多的时间去更=跟上迭代的步伐,而缺乏了对整个系统的把控 没有集群之前 ...

  5. Spring+quartz 实现定时任务job集群配置

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

  6. JavaEE开发之Spring中的多线程编程以及任务定时器详解

    上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...

  7. Spring+quartz 实现定时任务job集群配置【原】

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

  8. Spring+Quartz 实现定时任务的配置方法

    Spring+Quartz 实现定时任务的配置方法 整体介绍 一.Quartz介绍 在企业应用中,我们经常会碰到时间任务调度的需求,比如每天凌晨生成前天报表,每小时生成一次汇总数据等等.Quartz是 ...

  9. Spring+Quartz 集群

    这几天给Spring+Quartz的集群折腾得死去活来,google了无数页总算搞定,记下一些要点备以后使用. 单独的Quartz集群在http://unmi.blogjava.net/有Unmi翻译 ...

随机推荐

  1. 让你更值钱的方法:培养稀缺(追逐新技术,淬炼已有技能、做到出类拔萃,寻找自己所在的行业痛点,App开发者是市场动态平衡的典型)

    一个开发者,如何才能更值钱? 答案非常简单:掌握稀缺资源. 那么,怎样才能持续不断地掌握稀缺资源,让自己更值钱呢? 请看接下来介绍的 2 种识别稀缺的方法和 2 种培养稀缺的策略. 稀缺资源的秘密 资 ...

  2. LeetCode Algorithm 133_Clone Graph

    Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's ...

  3. iOS开发 非常全的三方库、插件、大牛博客等等

    UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableVie ...

  4. SQL Server 中计算农历

    1.建一表,放初始化资料   因为农历的日期,是由天文学家推算出来的,到现在只有到2049年的,以后的有了还可以加入!   CREATE TABLE SolarData ( yearId int no ...

  5. GO语言学习(十)Go 语言条件语句

    Go 语言提供了以下几种条件判断语句: 语句 描述 if 语句 if 语句 由一个布尔表达式后紧跟一个或多个语句组成. if...else 语句 if 语句 后可以使用可选的 else 语句, els ...

  6. POJ 2363 Blocks (ZOJ 1910) 数学

    杨宗纬的歌"这一路走来" 还蛮好听的,这首歌静静的躺在我的音乐盒某个阴暗的角落里,今天随机播放才发现的,哈哈. 数学一直是硬伤...... -------------------- ...

  7. Fragment为载体可自己主动布局的CardView(GitHub上写开源项目初体验)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 前些天一直在看Android5.0 的Material Desgin,里面新增 ...

  8. mac 系统 突破百度网盘网速限制

    感谢https://blog.csdn.net/Deft_MKJing/article/details/82561564

  9. 细说CSS伪类和伪元素

    原文 简书原文:https://www.jianshu.com/p/eae56b7fe7fe 大纲 1.伪元素 2.伪类元素 3.伪元素和伪类元素的区别 4.伪类和伪元素的使用 1.伪元素 伪元素在D ...

  10. JVM调优2

    原文地址:https://blog.csdn.net/sun1021873926/article/details/78002118 一.什么是JVM  JVM是Java Virtual Machine ...