- 浏览: 2095149 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (366)
- hadoop (91)
- DB (2)
- vmware (0)
- python (49)
- Java (72)
- Linux (57)
- 多线程 (2)
- hive (1)
- hbase (3)
- mongodb (5)
- Hibernate (3)
- nodejs (1)
- 模式与重构 (1)
- 持续集成CI (4)
- Mysql (2)
- chorme (1)
- 软件开发 (0)
- 敏捷 (5)
- maven (3)
- windows (7)
- 测试驱动 (1)
- scala (3)
- Jetty (0)
- android (1)
- eclipse (1)
- 设计模式 (1)
- 面向对象设计 (2)
- oracle (3)
- cassandra (15)
- pig (3)
- rails (1)
- redis (4)
- ruby (1)
- storm (0)
- 实时运算 (3)
- scribe (1)
- hadoop源码 (3)
- cassandra jna (1)
- Kafka (2)
- Sublime (2)
- C++ (2)
- C (1)
- 版本控制 (1)
- 服务器 (1)
- docker (0)
- flink (1)
最新评论
-
伍大都督:
解释太到位了,感谢分享
理解Linux系统中的load average(图文版) -
rfjian123:
非常感谢,用你的方法解决了问题。
Server sent unexpected return value (403 Forbidden) in response to OPTIONS -
yuhaifei12:
今天遇到同样的问题了。设置的是每分钟执行一次。结果发现每分钟执 ...
解决Linux下crontab同一时间重复执行问题 -
BigBird2012:
想问一下,使用ExecutorService每次都要调用 sh ...
spring quartz使用多线程并发“陷阱” -
zhuqx1130:
有用,谢谢
解决Sublime Text 3中文显示乱码(tab中文方块)问题
定义一个job:ranJob,设置每秒执行一次,设置不允许覆盖并发执行
<bean id="rankJob" class="com.chinacache.www.logstat.job.RankJob" /> <bean id="rankJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="rankJob" /> <property name="targetMethod" value="execute" /> <property name="concurrent" value="false" /> </bean> <bean id="rankJobTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="rankJobDetail" /> <!-- 单位 ms,半小时 1800000 ms --> <property name="repeatInterval" value="1000" /> </bean>
job代码:
System.out.println("Start job"); ExecutorService exec = Executors.newFixedThreadPool(1); Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("thread start"); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("thread end"); } }); exec.execute(thread); System.out.println("end job");
程序输出结果:
Start job end job thread start Start job end job thread start Start job end job thread start Start job end job thread start thread end
从结果可以看到,job的并发覆盖配置似乎根本没有生效,原因是:job没有关注多线程执行情况
修改job代码,添加如下代码在job访问最后,线程处理完job才结束,
while (!exec.isTerminated()) { // 等待所有子线程结束,才退出主线程 }
修改代码后程序结果:
Start job thread start thread end
可以看到job始终没有结束,说明ExecutorService始终没有终止,看看文档,加入shutdonw()方法,job所有代码如下:
public void execute() throws InterruptedException { System.out.println("Start job"); ExecutorService exec = Executors.newFixedThreadPool(1); Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("thread start"); try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("thread end"); } }); exec.execute(thread); exec.shutdown(); while (!exec.isTerminated()) { // 等待所有子线程结束,才退出主线程 } System.out.println("end job"); }
打印结果如下:
Start job thread start thread end end job Start job thread start thread end end job Start job thread start thread end end job
OK,至此spring quartz多线程并发问题解决。回顾下,我们要使用isTerminated()方法等多线程结束后在结束job;多线程任务派发结束后,要使用shutdown()方法顺序关闭线程(等待正在执行任务,不接受新任务)
评论
1 楼
BigBird2012
2016-06-16
想问一下,使用ExecutorService每次都要调用 shutdown?我的理解是给线程分配的任务执行完了线程就会释放,处于空闲状态,等待新的任务,shutdown 是不是将整个线程池关闭了呢?
发表评论
-
shell下使用log4j 1.x “No appenders could be found for logger”问题两个处理办法
2018-05-25 23:25 1641错误: log4j:WARN No appenders c ... -
通过java class文件确定其编译器版本
2016-06-23 10:45 1074方法一: hexdump -C XXX.class ... -
字符编码笔记:ASCII,Unicode和UTF-8(转)
2014-11-06 17:29 1237今天中午,我突然想搞 ... -
Server sent unexpected return value (403 Forbidden) in response to OPTIONS
2014-10-10 15:01 5555之前用的好好的,忽然某天再次svn up时候就报下面的错误: ... -
netbeans下优秀sublinme主题
2014-09-29 10:13 3631推荐站点:http://netbeansthemes.com ... -
将netbeans项目放到jenkins上做持续集成
2014-07-25 15:20 1230netbeans项目本质是通过ANT来管理的,只不 ... -
关于jvm中Xmx参数默认值
2014-05-08 09:19 2015我的机器win7 64bit 8GB内存,通过jconso ... -
Eclipse代码自动完成功能无法使用问题记录
2014-04-28 10:15 1141使用Alt+/无法补齐Java代码,现象时没有反应。解决方 ... -
thrift0.9.1简单教程(包含Java服务端和Java、python客户端)
2014-04-25 15:55 6406一、Thrift Java服务端和客户端 官 ... -
使用sublime text3开发scala
2014-04-04 16:49 3766打开菜单栏Tool->build system-> ... -
netbeans下打开本地文件夹插件(explorer)
2014-04-02 14:44 20281. 在线安装 工具->插件->可用插 ... -
关闭Sublime自动更新
2014-03-09 21:42 838每次启动都提示更新,可以关闭它。 找到Prefere ... -
使用log4j.properties配置slf4j输出LOG
2014-01-09 08:57 6648完成配置需要以下文件: slf4j-log4j12-x ... -
正确使用java -cp通配符
2013-11-21 17:05 10185JDK6支持java -cp后面跟通配符'*',试了一下发 ... -
强制Java使用东八时区方法
2013-11-15 15:37 1835今天线上有台服务器时区错误,导致很多使用new Da ... -
谨慎使用java的PrintWriter类
2013-10-23 12:31 1362public void test() throws Fil ... -
记录Java ShutdownHook
2013-08-30 11:40 1072public class TestMe { stat ... -
eclipse + maven + jetty + spring web 开发环境简要笔记
2013-08-27 11:25 1608环境准备 确保安装maven3 确保安装eclip ... -
Eclipse(IDE for Java Developers)、maven、jetty、spring web集成
2013-08-27 08:53 0方法一: http://wiki.eclipse.o ... -
关于数据压缩
2013-08-23 14:26 1132常用压缩 quicklz zlib snappy/ ...
相关推荐
6. **并发和集群**:Quartz支持多线程和多服务器环境,Spring Quartz也继承了这一特性。通过集群配置,可以在多台服务器上共享任务调度,提高系统的可用性和可靠性。 7. **监控和管理**:Spring Quartz提供了Web...
在多应用服务器负载均衡环境下,Spring Quartz定时任务的重复执行问题是一个常见的挑战。Spring Quartz是一个强大的、开源的作业调度框架,允许开发者定义和执行复杂的定时任务。然而,当多个服务器实例并行运行时,...
这里`myTargetObject`是一个bean引用,表示执行任务的目标对象,`executeTask`是该对象上的执行方法,`concurrent`属性决定是否允许多线程并发执行。 总结来说,Spring与Quartz的集群模式是通过共享数据库存储和...
- **线程安全**:确保Job是线程安全的,因为Quartz可能并发执行多个Job实例。 - **资源管理**:合理配置ThreadPool大小,避免资源浪费。 通过以上知识点,我们可以看到Spring Quartz为Java开发人员提供了强大且...
当我们遇到Spring定时器执行两次或者更多次的问题时,这通常是由于配置不当或者多线程并发导致的。下面将详细介绍如何使用Spring集成Quartz,以及解决定时任务重复执行的问题。 首先,让我们了解Spring如何配置...
Spring Quartz 还提供了一套机制来处理并发任务,如设置任务实例的并发策略,可以控制一个任务实例在同一时间只被一个线程执行,或者允许多个线程并行执行。 9. **任务持久化** Quartz支持任务和触发器的持久化...
不过,由于Timer的线程模型存在一些限制,如所有定时任务都在同一个线程中运行,因此在多任务并发执行时可能会有性能问题。因此,对于复杂的定时任务需求,推荐使用Quartz这样的专业调度库。 Quartz与Spring的整合...
此外,Quartz 支持集群环境,可以在多个节点之间共享任务,提高系统的可用性和可靠性。 Spring 框架与这两个定时任务工具有很好的集成。对于`java.util.Timer`,Spring 提供了`org.springframework.scheduling....
2. **多线程与并发**:Quartz能够处理多个线程和并发任务,确保高效率和可靠性。 3. **持久化**:支持多种数据存储机制,如JDBC、RAMJobStore、RAMTriggerStore等,确保在系统重启后仍能恢复作业状态。 4. **插件...
标题 "HttpClient + Spring 实现多线程" 涉及到的是如何在Spring框架中使用Apache HttpClient库来创建一个支持多线程的HTTP客户端服务。Apache HttpClient是一个强大的HTTP客户端API,它提供了丰富的功能来处理HTTP...
而Spring和Quartz设计时考虑了多线程和并发,更适合企业级应用。 4. 故障恢复:Quartz具有故障恢复和集群支持,如果任务执行失败,它可以重新安排任务执行,而Spring 2.0的`Job`则需要额外的代码来实现类似功能。 ...
4. **并发和线程管理**:Quartz支持多线程执行,书中会讲解如何处理并发问题,例如避免多个实例同时执行同一作业,以及如何调整线程池大小以优化性能。 5. **日志和监控**:学习如何集成日志框架,以便记录作业执行...
2. **线程安全**:当多个Job实例并行运行时,确保注入的Bean是线程安全的,或者对并发访问进行了适当的同步控制。 3. **Job实例复用**:Quartz允许Job实例的复用,因此要确保Job类的状态不会在不同调度之间互相干扰...
总结来说,如果你需要一个强大的、可配置的、多线程的任务调度系统,Quartz是更好的选择;而如果任务需求简单,`Timer`则能满足基本需求。在Spring中,两者都可以方便地集成,根据项目的需求选择合适的工具是非常...
- 任务并发执行:Quartz默认情况下,同一Job实例可能会被多个线程同时执行,这可能导致数据不一致。可以通过设置Job的`concurrency`属性为`false`,确保任务的串行执行。 - 事务管理:由于Quartz并不内置事务支持,...
当涉及到并发支持时,`@Scheduled`默认是单线程执行,如果需要并发执行任务,可以通过设置`concurrentTasksScheduler`属性为true来启用多线程。而Quartz则允许在配置中指定每个Job实例的并发策略,比如单实例(不...
- **线程安全**:确保 Job 代码是线程安全的,因为 Quartz 默认会并发执行多个实例。 综上所述,Spring 和 Quartz 的结合使用为 Java 应用提供了强大而灵活的任务调度能力。通过 Spring 的管理,我们可以更轻松地...
Spring框架是Java开发中广泛使用的应用框架,而Quartz则是一个功能强大的作业调度库,能够帮助开发者在应用程序中实现定时任务的安排。本篇文章将深入探讨Spring如何与Quartz集成,以及它们之间的协同工作原理。 ...
-novel”表明这是一个关于多线程编程的高质量学习资料,结合“基于时下最新 Java 技术栈 Spring Boot 3 + Vue 3 开发”,我们可以推断出这是一套综合了后端与前端开发的教程,主要聚焦在Java的并发处理上,同时利用...
例如,可以使用多线程并行生成,以提高效率;同时,确保在生成静态页面时,动态内容的缓存能够及时更新。 总之,通过Spring和Quartz的组合,我们可以实现自动化、定时生成网站的静态页面,从而提升网站性能和用户...