将任务的Trigger设置为每10秒钟执行一次,然后在执行的任务体内让Thread暂停15秒钟,这样不同的job之间肯定会有时间上的重叠。当启动程序之后,发现前一个job执行结束的时刻的秒数为15,而且第二个本来在10s就执行的job马上就启动了。 由此可见,concurrent属性实际是将job推迟执行了。 本文说不同job不够准确,而且会引起歧义,以为是另一个定时任务,准确的说是下一次执行的相同job。 concurrent 表示是否允许任务并发执行,当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程。简单测试例子验证:
public class ConcurTest {
/** 日志 */
private static final Logger logger = LoggerFactory.getLogger(ConcurTest.class);
public void test() {
logger.error("begin:{}", System.currentTimeMillis());
try {
Thread.sleep(15000);
} catch (Exception e) {
e.printStackTrace();
logger.error("ConcurTest-test:17 {}", e.getMessage());
}
logger.error("end:{}", System.currentTimeMillis());
}
}
xml设置 每10秒钟调用一次,配置如下
<bean id="concurTest"
class="com.trc.quartz.Query.ConcurTest" />
<!-- 定义调用对象和调用对象的方法 -->
<bean id="concurTestQueryDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 调用的类 -->
<property name="targetObject" ref="concurTest" />
<!-- 调用类中的方法 -->
<property name="targetMethod" value="test" />
<!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
<property name="concurrent" value="false" />
</bean>
<!-- 定义触发时间 -->
<bean id="concurTestQueryTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="concurTestQueryDetail" />
</property>
<!-- 每隔2小时触发 -->
<property name="cronExpression">
<value>*/10 * * * * ?</value>
</property>
</bean>
<!-- 触发器列表 -->
<!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->
<!-- 如果lazy-init='true',则需要实例化该bean才能执行调度程序 -->
<bean name="startQuartz" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="concurTestQueryTrigger"/>
</list>
</property>
</bean>
生成的结果如下:
2019-02-13 17:21:55.087 [startQuartz_Worker-2] ERROR com.trc.quartz.Query.ConcurTest - begin:1550049715087
2019-02-13 17:22:10.087 [startQuartz_Worker-2] ERROR com.trc.quartz.Query.ConcurTest - end:1550049730087
2019-02-13 17:22:10.089 [startQuartz_Worker-3] ERROR com.trc.quartz.Query.ConcurTest - begin:1550049730089
startQuartz_Worker-2 线程执行睡眠15s,完成后,立即开启了新线程startQuartz_Worker-3 ,从而说明了concurrent 设置为false时,只是将任务给推迟,并没有将任务取消。

本文介绍了JAVA定时器中concurrent属性的作用。通过设置Trigger每10秒执行一次任务,任务内部暂停15秒,观察到当concurrent属性为false时,任务会推迟执行,等待前一个线程完成后再启动新的线程。测试示例验证了concurrent属性用于控制任务并发执行,设置为false意味着避免任务重叠执行。

1万+

被折叠的 条评论
为什么被折叠?



