13
回答
Quartz是干嘛的?
滴滴云服务器,限时包月0.9元,为开发者而生>>>   

刚才在项目里面配合spring加了几个jar包用Quartz写了个定时任务。

<!-- 后台任务-->
    <bean id="quartzJob" class="com.smc.mobiletv.scheduler.Job"></bean>
    <!-- 定义调用对象和调用对象的方法 -->
    <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 调用的类 -->
        <property name="targetObject">
            <ref bean="quartzJob"/>
        </property>
        <!-- 调用类中的方法 -->
        <property name="targetMethod">
            <value>execute</value>
        </property>
    </bean>
    <!-- 定义触发时间 -->
    <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="jobtask"/>
        </property>
        <!-- cron表达式 -->
        <property name="cronExpression">
            <value>0/10 * * * * ?</value>
        </property>
    </bean>
    <!-- 总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序  -->
    <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="doTime"/>
            </list>
        </property>
    </bean>

然后我就想用Quartz有什么好处啊,我自己写一个也很不也很简单吗。搞不懂为什么要用,很迷茫,刚才老大还说准备在项目组搞搞技术交流,每个人都讲讲自己用到的一些关键技术,老大让我讲这个。

package com.package;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Quartz implements Runnable {

	private long sleepTimeLength=3600*1000L;
	
	@Override
	public void run() {
		while(true){
			try {
				System.out.println("zzzzz每隔"+sleepTimeLength/1000+"秒检查到到零晨两点没有");
				Thread.sleep(sleepTimeLength);
				Calendar c=Calendar.getInstance(); 
				SimpleDateFormat sdf=new SimpleDateFormat("HH");
				String hour=sdf.format(c.getTime());
				if("02".equals(hour)){
					System.out.println("**********每天零晨两点执行一次***********");
					Thread.sleep(sleepTimeLength);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		Quartz q=new Quartz();
		new Thread(q).start();
	}
}


举报
喜之郎
发帖于5年前 13回/1K+阅
共有13个答案 最后回答: 5年前
先不谈性能集群什么什么的,就说一个实际的问题,你自己写的方法只局限在某些功能里,别人能用么?时间指定是否灵活?这个项目是没有问题,但下一个项目呢?再写一遍???再教别人?然后你这个轮子又不够强大,每次用每次改,遇到不同的需求的时候又改,最后乱七八糟自己也改不了了,别人也懒得看了,出了问题了和SB一样.
--- 共有 6 条评论 ---
喜之郎回复 @loyal : 回复 @loyal : 看来我对“调度”一词理解有误。 5年前 回复
loyal回复 @喜之郎 : 简单点说是任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务。对于java中多种调度系统的比较可以参见 http://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/ 5年前 回复
喜之郎回复 @loyal : 还有就是“调度”一词该怎么理解呢。各个任务各看独立运行,各不干扰,有什么好调度的呢? 5年前 回复
loyal回复 @喜之郎 : quartz确实有两种模式,简单模式就是不用表达式的!!!复杂模式才用表达是的,但为了工作中减少多模式开发,所以统一到一种模式方便大家学习.只需要学习一个表达式而已,其他照抄就行了. 5年前 回复
loyal回复 @喜之郎 : 呵呵,你这个问题问的好,但这个问题是可以回答你的.因为它是标准,在团队中你是有方向给别人讲解的,网上教程一大堆,它的标准是这样那么大家这么去写就好了.如果你真的懒得动脑子去写,那么你下载个quartz表达式生成器就行了.完全可视化,最后粘贴出来表达式就行了. 5年前 回复

你是可以自己写个,但是有没有想过耦合度 扩展性? 而且他支持集群.功能全面强大.

最后说一句. 不要重复造轮子. 框架中所蕴含的经验,不是你一两分钟就能窥探清楚的.

--- 共有 14 条评论 ---
LeungBin回复 @喜之郎 : 我们是用JAVA写服务端的,服务端框架也是自己写的,所以在多线程方面我们会相当的慎重。1000个线程我们看过1000个任务然后丢进线程池里面执行。你说谁的效率高? 5年前 回复
喜之郎回复 @LeungBin : 在下面有个开启1000个线程的项目,你可以见识下。 5年前 回复
喜之郎回复 @LeungBin : 看下面的回复,做给你看看。 5年前 回复
我是潮汐回复 @喜之郎 : 你把定时任务想的太简单了...没在实际生成环境用过就不要妄加评论..quartz带来的好处不是一句两句就能说完的. 5年前 回复
LeungBin回复 @LeungBin : 来一个任务就开一条线程,在我项目组里面是决定禁止这样做的,首先是线程管理问题,二是线程太多线程创建销毁消耗太大,同时线程切换消耗也很恐怖。你可以偷懒不用线程池,但是不要把自己的无知当做装B的资本! 5年前 回复

开启1000个线程

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Quartz implements Runnable {

	private long sleepTimeLength=3600*1000L;
	
	@Override
	public void run() {
		while(true){
			try {
				System.out.println(Thread.currentThread().getName()+"zzzzz每隔"+sleepTimeLength/1000+"秒检查到到零晨两点没有");
				Thread.sleep(sleepTimeLength);
				Calendar c=Calendar.getInstance(); 
				SimpleDateFormat sdf=new SimpleDateFormat("HH");
				String hour=sdf.format(c.getTime());
				if("02".equals(hour)){
					System.out.println("**********每天零晨两点执行一次***********");
					Thread.sleep(sleepTimeLength);
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		Quartz q=new Quartz();
		for(int i=0;i<1000;i++){
			new Thread(q).start();
		}
	}
}
执行结果

Thread-0zzzzz每隔3600秒检查到到零晨两点没有
Thread-2zzzzz每隔3600秒检查到到零晨两点没有
Thread-4zzzzz每隔3600秒检查到到零晨两点没有
Thread-6zzzzz每隔3600秒检查到到零晨两点没有
Thread-1zzzzz每隔3600秒检查到到零晨两点没有
Thread-8zzzzz每隔3600秒检查到到零晨两点没有
Thread-7zzzzz每隔3600秒检查到到零晨两点没有
Thread-5zzzzz每隔3600秒检查到到零晨两点没有
Thread-3zzzzz每隔3600秒检查到到零晨两点没有
Thread-9zzzzz每隔3600秒检查到到零晨两点没有
Thread-10zzzzz每隔3600秒检查到到零晨两点没有
。
。
。
Thread-927zzzzz每隔3600秒检查到到零晨两点没有
Thread-925zzzzz每隔3600秒检查到到零晨两点没有
Thread-923zzzzz每隔3600秒检查到到零晨两点没有
Thread-921zzzzz每隔3600秒检查到到零晨两点没有
Thread-919zzzzz每隔3600秒检查到到零晨两点没有
Thread-917zzzzz每隔3600秒检查到到零晨两点没有
Thread-915zzzzz每隔3600秒检查到到零晨两点没有
Thread-913zzzzz每隔3600秒检查到到零晨两点没有
开启完后:

挺搞笑的,无知者无畏。
--- 共有 3 条评论 ---
喜之郎回复 @huan : 你说的这个时间误差的问题,有可能导致两次检查时间超过一小时,那么就有可能跳过不执行。是个Bug。 5年前 回复
huan看你这么诚心的份上,就提点你一下,其他问题我就不说了。Thread.sleep(3600×1000) 能保证这个线程在3600秒后执行么? 去看看api,还不清楚就谷歌一下吧。 5年前 回复
喜之郎求大侠指点迷津。。。 5年前 回复
顶部