定时器concurrent属性简单介绍

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

        将任务的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时,只是将任务给推迟,并没有将任务取消。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值