任务_任务调度 - CSDN
精华内容
参与话题
  • 在线任务平台

    2020-07-16 23:33:19
    基于微信的任务发布接收平台,包含微信、支付宝支付;PHP版
  • javascript的宏任务和微任务

    万次阅读 多人点赞 2019-03-14 20:02:47
    今天进行了人生中的第一次面试。结果凉凉了。但是还是学到了很多东西。其中在面试时面试官问了我一道题 setTimeout(function(){ console.log('1') }); ... new Promise(function(resolve){ ...

    今天进行了人生中的第一次面试。结果凉凉了。但是还是学到了很多东西。其中在面试时面试官问了我一道题

    setTimeout(function(){
    		    console.log('1')
    		});
    
    		new Promise(function(resolve){
    		    console.log('2');
                        resolve();
    		}).then(function(){
    		    console.log('3')
    		});
    
    		console.log('4');

    请你给出这段代码的运行顺序。当时我就蒙犊子了。同步异步我看过很多的讲解,大多都是要么你就一个setTimeout函数,要么就一个Promise函数。两个函数放到一起的我还真没见过。于是我就想:

    settimeout肯定是异步的。 我也知道有一个event队列,你settimeout没设置时间应该直接就进入这个队列了吧,然后就是Promise的回掉函数进入event队列。 当时我二话不说给了个答案 2,4,1,3.并且很自信。然后面试官就问你不想想了?我说不想了。然后后半段他全程开始皱眉头了。我也凉凉。最后他让我回去看一下宏任务和微任务。

    首先说一下普通的异步函数的执行过程吧:

     

    同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。当指定的事情完成时,Event Table会将这个函数移入Event Queue。主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。上述过程会不断重复,也就是常说的Event Loop(事件循环)。

    图文我是转载的一个掘金的老哥的文章里的。他叫:ssssyoki

     

    ssssyoki

    那么如此看来我给的答案还是对的。但是js异步有一个机制,就是遇到宏任务,先执行宏任务,将宏任务放入eventqueue,然后在执行微任务,将微任务放入eventqueue最骚的是,这两个queue不是一个queue。当你往外拿的时候先从微任务里拿这个回掉函数,然后再从宏任务的queue上拿宏任务的回掉函数。 我当时看到这我就服了还有这种骚操作。

    再盗个图

    而宏任务一般是:包括整体代码script,setTimeout,setInterval。

    微任务:Promise,process.nextTick。

    记住就行了。

    然后回到开头的代码。因为settimeout是宏任务,虽然先执行的他,但是他被放到了宏任务的eventqueue里面,然后代码继续往下检查看有没有微任务,检测到Promise的then函数把他放入了微任务序列。等到主线进程的所有代码执行结束后。先从微任务queue里拿回掉函数,然后微任务queue空了后再从宏任务的queue拿函数。

    所以正确的执行结果当然是:2,4,3,1。

    如果还是不懂得同学可以去看一下这个老哥的文章,总结的挺到位的。向他学习。点击打开链接

    展开全文
  • 任务学习

    万次阅读 2018-01-12 16:47:04
    任务学习(Multitask learning)是迁移学习算法的一种,迁移学习可理解为定义一个一个源领域source domain和一个目标领域(target domain),在source domain学习,并把学习到的知识迁移到target domain,提升...

    简介:
    多任务学习(Multitask learning)是迁移学习算法的一种,迁移学习可理解为定义一个一个源领域source domain和一个目标领域(target domain),在source domain学习,并把学习到的知识迁移到target domain,提升target domain的学习效果(performance)。


    概念解析

    多任务学习(Multi-task learning):由于我们的关注点集中在单个任务上,我们忽略了可能帮助优化度量指标的其它信息。具体来说,这些信息来自相关任务的训练信号。通过共享相关任务之间的表征,可以使我们的模型更好地概括原始任务。这种方法被称为多任务学习(MTL)。其也是一种归纳迁移机制,主要目标是利用隐含在多个相关任务的训练信号中的特定领域信息来提高泛化能力,多任务学习通过使用共享表示并行训练多个任务来完成这一目标。归纳迁移是一种专注于将解决一个问题的知识应用到相关的问题的方法,从而提高学习的效率。比如,学习行走时掌握的能力可以帮助学会跑,学习识别椅子的知识可以用到识别桌子的学习,我们可以在相关的学习任务之间迁移通用的知识。此外,由于使用共享表示,多个任务同时进行预测时,减少了数据来源的数量以及整体模型参数的规模,使预测更加高效。因此,在多个应用领域中,可以利用多任务学习来提高效果或性能,比如垃圾邮件过滤、网页检索、自然语言处理、图像识别、语音识别等。
    归纳偏执(inductive bias):归纳迁移的目标是利用额外的信息来源来提高当前任务的学习性能,包括提高泛化准确率、学习速度和学习的模型的可理解性。提供更强的归纳偏执是迁移提高泛化能力的一种方法,可以在固定的训练集上产生更好的泛化能力,或者减少达到同等性能水平所需要的训练样本数量。归纳偏执会导致一个归纳学习器更偏好一些假设,多任务学习正是利用隐含在相关任务训练信号中的信息作为一个归纳偏执来提高泛化能力。归纳偏置的作用就是用于指导学习算法如何在模型空间中进行搜索,搜索所得模型的性能优劣将直接受到归纳偏置的影响,而任何一个缺乏归纳偏置的学习系统都不可能进行有效的学习。不同的学习算法(如决策树,神经网络,支持向量机等)具有不同的归纳偏置,人们在解决实际问题时需要人工地确定采用何种学习算法,实际上也就是主观地选择了不同的归纳偏置策略。一个很直观的想法就是,是否可以将归纳偏置的确定过程也通过学习过程来自动地完成,也就是采用“学习如何去学(learning to learn)”的思想。多任务学习恰恰为上述思想的实现提供了一条可行途径,即利用相关任务中所包含的有用信息,为所关注任务的学习提供更强的归纳偏置。


    详解

    1.从机器学习的角度来看,我们将多任务学习视为一种归约迁移(inductive transfer)。归约迁移(inductive transfer)通过引入归约偏置(inductive bias)来改进模型,使得模型更倾向于某些假设。举例来说,常见的一种归约偏置(Inductive bias)是L1正则化,它使得模型更偏向于那些稀疏的解。在多任务学习场景中,归约偏置(Inductive bias)是由辅助任务来提供的,这会导致模型更倾向于那些可以同时解释多个任务的解,这样做会使得模型的泛化性能更好。

    2.深度学习中两种多任务学习模式:隐层参数的硬共享与软共享
    (1)参数的硬共享机制:参数的硬共享机制是神经网络的多任务学习中最常见的一种方式,一般来讲,在实际应用中,通常通过在所有任务之间共享隐藏层,同时保留几个特定任务的输出层来实现。硬共享机制降低了过拟合的风险。事实上,有文献证明了这些共享参数过拟合风险的阶数是N,其中N为任务的数量,比任务相关参数的过拟合风险要小。直观来将,这一点是非常有意义的。越多任务同时学习,我们的模型就能捕捉到越多任务的同一个表示,从而导致在我们原始任务上的过拟合风险越小。
    (2)参数的软共享机制(基于约束的共享(regularization based)):每个任务都由自己的模型,自己的参数。在共享 Soft 参数时,每个任务都有自己的参数和模型。模型参数之间的距离是正则化的,以便鼓励参数相似化。我们对模型参数的距离进行正则化来保障参数的相似。如有文献使用L2距离正则化,而也有文献使用迹正则化(trace norm)。用于深度神经网络中的软共享机制的约束很大程度上是受传统多任务学习中正则化技术的影响。约束深度神经网络 Soft 参数共享的思想受到了 MTL 正则化技术的极大启发,这种思想已经用于其它模型开发。

    3.多任务学习的有效性
    由于所有任务都或多或少存在一些噪音,例如,当我们训练任务A上的模型时,我们的目标在于得到任务A的一个好的表示,而忽略了数据相关的噪音以及泛化性能。由于不同的任务有不同的噪音模式,同时学习到两个任务可以得到一个更为泛化的表示(As different tasks have different noise patterns, a model that learns two tasks simultaneously is able to learn a more general representations.)。如果只学习任务A要承担对任务A过拟合的风险,然而同时学习任务A与任务B对噪音模式进行平均,可以使得模型获得更好表示F;
    若任务噪音严重,数据量小,数据维度高,则对于模型来说区分相关与不相关特征变得困难。多任务有助于将模型注意力集中在确实有影响的那些特征上,是因为其他任务可以为特征的相关与不相关性提供额外的证据;
    对于任务B来说很容易学习到某些特征G,而这些特征对于任务A来说很难学到。这可能是因为任务A与特征G的交互方式更复杂,或者因为其他特征阻碍了特征G的学习。通过多任务学习,我们可以允许模型窃听(eavesdrop),即使用任务B来学习特征G;
    多任务学习更倾向于学习到一类模型,这类模型更强调与其他任务也强调的那部分表示。由于一个对足够多的训练任务都表现很好的假设空间,对来自于同一环境的新任务也会表现很好,所以这样有助于模型展示出对新任务的泛化能力;
    单任务学习时,梯度的反向传播倾向于陷入局部极小值。多任务学习中不同任务的局部极小值处于不同的位置,通过相互作用,可以帮助隐含层逃离局部极小值;
    添加的任务可以改变权值更新的动态特性,可能使网络更适合多任务学习。比如,多任务并行学习,提升了浅层共享层(shared representation)的学习速率,可能,较大的学习速率提升了学习效果;
    正则化机制:多任务学习通过引入归纳偏置(inductive bias)起到与正则化相同的作用。正是如此,它减小了模型过拟合的风险,同时降低了模型的Rademacher复杂度,即拟合随机噪音的能力。

    4.多任务学习MTL 有很多形式:联合学习(joint learning)、自主学习(learning to learn)和带有辅助任务的学习(learning with auxiliary task)等都可以指 MTL。一般来说,优化多个损失函数就等同于进行多任务学习(与单任务学习相反)。这些情况有助于你明确地思考如何在 MTL 方面做尝试并从中获得启发。

    5.多任务学习与其他学习算法之间的关系
    迁移学习:自1995年以来,迁移学习吸引了众多的研究者的目光,迁移学习有很多其他名字:学习去学习(Learning to learn)、终身学习(life-long learning)、推导迁移(inductive transfer)、知识强化(knowledge consolidation)、上下文敏感性学习(context-sensitive learning)、基于知识的推导偏差(knowledge-based inductive bias)、累计/增量学习(increment / cumulative learning)等。在机器学习、深度学习和数据挖掘的大多数任务中,会假设training和inference时,采用的数据服从相同的分布(distribution)、来源于相同的特征空间(feature space)。但在现实应用中,这个假设很难成立,往往遇到一些问题:

    a.带标记的训练样本数量有限。比如,处理A领域(target domain)的分类问题时,缺少足够的训练样本。同时,与A领域相关的B(source domain)领域,拥有大量的训练样本,但B领域与A领域处于不同的特征空间或样本服从不同的分布。
    b.数据分布会发生变化。数据分布与时间、地点或其他动态因素相关,随着动态因素的变化,数据分布会发生变化,以前收集的数据已经过时,需要重新收集数据,重建模型。

    多任务学习是针对数据给出多个监督信息(标签)进行学习,例如识别一张图像中的脸是否是人脸、脸部表情、性别、年龄等,识别图像中车的颜色、车型、姿态等,都属于多任务分类。
    多标签学习(Multilabel learning)是多任务学习中的一种,建模多个label之间的相关性,同时对多个label进行建模,多个类别之间共享相同的数据/特征。
    多类别学习(Multiclass learning)是多标签学习任务中的一种,对多个相互独立的类别(classes)进行建模。这几个学习之间的关系如下图所示:
    这里写图片描述


    6.实例介绍

    (1)人脸识别:多任务学习给出多个监督信息(标签),利用任务之间的相关性互相促进。香港中文大学汤晓鸥组发表在NIPS14的论文《Deep Learning Face Representation by Joint Identification-Verification》,提出了一种联合训练人脸确认损失和人脸分类损失的多任务人脸识别网络DeepID2(Deep IDentification-verification features)。DeepID2中共有两个损失函数,分别为人脸分类损失函数和人脸验证loss。结合两个损失学习效果会更好,原因是:分类任务旨在区分不同类,理论上,只要类别不同学习到的特征肯定不同,重点在于扩大类间距离,而验证这个任务从另一个方面提取特征:缩小类内距离扩大类间相对距离!但是后者提取到的特征不能用于分类,只能做二值区分。所以说两个任务具有一定的互补性!
    这里写图片描述

    (2)脸部特征点检测:脸部特征点检测受遮挡和姿势变化等问题的影响,:通过多任务学习具有提高检测健壮性的可能性,而不是把检测任务视为单一和独立的问题。多任务学习希望把优化脸部特征点检测和一些不同但细微相关的任务结合起来,比如头部姿势估计和脸部属性推断。脸部特征点检测不是一个独立的问题,它的预测会被一些不同但细微相关的因素影响。比如一个正在笑的孩子会张开嘴,有效地发现和利用这个相关的脸部属性将帮助更准确地检测嘴角。
    如下图,一个TCDCN模型,除了检测特征点任务,还有识别眼镜、笑脸、性别和姿态这四个辅助任务,通过与其它网络的对比,可以看出辅助任务使主任务的检测更准确。
    这里写图片描述

    TCDCN通过随机梯度下降进行学习,不同的任务有不同的损失函数和学习难度,因此有不同的收敛速度,网络结构如下图所示。早期的方法通过探索任务之间的关系,比如学习所有任务权重的协方差矩阵来解决收敛速度不同的问题,但是这种方法只能在所有任务的损失函数相同时才能应用。TCDCN采用一种尽快停止辅助任务的方法避免这些任务对训练集过拟合后影响主任务的学习:即在训练开始时,TCDCD受所有任务的约束,避免陷入不好的局部最优;随着训练的进行,有些辅助任务将不再使主任务受益,它们的学习过程将被停止。
    这里写图片描述

    (3)目标检测: Fast R-CNN。Fast R-CNN 是一个物体检测的快速的基于区域的卷积网络,其中也有多任务深度学习的应用,图中展示了Fast R-CNN的网络结构。一张图片和多个RoI(感兴趣区域)输入到一个全卷积网络,每个RoI会进入一个固定大小的feature map,然后被全连接层映射到一个特征向量。每个RoI有两个输出:softmax概率和每个分类的矩形框回归补偿。

    这里写图片描述
    一个Fast R-CNN网络有两个输出层:第一个输出K+1个分类的概率分布;第二个输出每个分类的边框回归补偿。每个训练RoI标注为一个参考标准分类u和一个参考标准边框回归对象v,在每个标注的RoI用多任务损失函数L来共同训练分类和矩形框回归。


    总结
    现实世界中很多问题不能分解为一个一个独立的子问题,即使可以分解,各个子问题之间也是相互关联的,通过一些共享因素或共享表示(share representation)联系在一起。把现实问题当做一个个独立的单任务处理,忽略了问题之间所富含的丰富的关联信息。多任务学习就是为了解决这个问题而诞生的。把多个相关(related)的任务(task)放在一起学习。这样做真的有效吗?答案是肯定的。多个任务之间共享一些因素,它们可以在学习过程中,共享它们所学到的信息,这是单任务学习所具备的。相关联的多任务学习比单任务学习能去的更好的泛化(generalization)效果。

    多任务学习是一种归纳迁移机制,利用额外的信息来源来提高当前任务的学习性能,包括提高泛化准确率、学习速度和已学习模型的可理解性。在学习一个问题的同时,可以通过使用共享表示来获得其他相关问题的知识。

    能提高泛化能力的可能原因有三:第一,不相关任务对于聚合梯度的贡献相对于其他任务来说可以视为噪声,不相关任务也可以通过作为噪声源来提高泛化能力;第二,增加任务会影响网络参数的更新,比如增加了隐层有效的学习率;第三,多任务网络在所有任务之间共享网络底部的隐层,或许更小的容量就可以获得同水平或更好的泛化能力。因此,我们需要关注如何选择多个相关任务及数据集使网络更好地泛化,有四种机制可以帮助多任务学习网络更好地泛化:统计数据增强、属性选择、信息窃取、表示偏置。

    多任务学习将会在越来越多的领域作为一种提高神经网络学习能力的手段被广泛应用。 深度学习网络是具有多个隐层的神经网络,在深度学习网络中应用多任务学习是一种很自然的想法。机器视觉领域有广泛的多任务学习应用,主要方式包括:
    多个任务并行输出;
    同时做分类和回归或使用不同的损失函数
    多个任务如流水线般,辅助任务附加在主任务后面。


    Reference
    机器之心:https://www.jiqizhixin.com/articles/2017-06-23-5
    [1] T. Evgeniouand M. Pontil. Regularized multi-task learning. In Proceeding of thetenth ACM SIGKDD international conference on Knowledge Discovery and DataMining, 2004.

    [2] T. Jebara. MultitaskSparsity via Maximum Entropy Discrimination. In Journal of Machine LearningResearch, (12):75-110, 2011.

    [3] A. Argyriou,T. Evgeniou and M. Pontil. Convex multitask feature learning. In MachineLearning, 73(3):243-272, 2008.

    [4] T. G. Dietterich, L. Pratt, and S. Thrun, Eds., “Machine Learning – Special issue on inductive transfer,” Mach Learn, vol. 28, no. 1, 1997.

    [5] L. Holmstrom and P. Koistinen, “Using additive noise in back-propagation training,” IEEE Trans. Neural Netw., vol. 3, no. 1, pp. 24–38, Jan. 1992.

    [6] Z. Zhang, P. Luo, C. C. Loy, and X. Tang, “Facial Landmark Detection by Deep Multi-task Learning,” in Computer Vision – ECCV 2014: 13th European Conference, Zurich, Switzerland, September 6-12, 2014, Proceedings, Part VI, D. Fleet, T. Pajdla, B. Schiele, and T. Tuytelaars, Eds. Cham: Springer International Publishing, 2014, pp. 94–108.

    [7] Y. Sun, Y. Chen, X. Wang, and X. Tang, “Deep Learning Face Representation by Joint Identification-Verification,” in Advances in Neural Information Processing Systems 27, Z. Ghahramani, M. Welling, C. Cortes, N. D. Lawrence, and K. Q. Weinberger, Eds. Curran Associates, Inc., 2014, pp. 1988–1996.

    [8] G. B. Huang, M. Ramesh, T. Berg, and E. Learned-Miller, “Labeled faces in the wild: A database for studying face recognition in unconstrained environments,” Technical Report 07-49, University of Massachusetts, Amherst, 2007.

    [9] R. Girshick, “Fast R-CNN,” in The IEEE International Conference on Computer Vision (ICCV), 2015.

    展开全文
  • 任务、微任务

    千次阅读 多人点赞 2018-11-19 10:27:51
    任务与微任务? B-树中含511个关键字,B-树为3阶,则包含叶子节点层该树最大深度为? 8 9 10 11

    宏任务与微任务

    这是前端笔试题常考的一个点,给你一段代码,写出代码的输出结果。以前总觉得了解异步与同步的区别,知道异步任务放入另一个队列就可以了,实际上没有这么简单。看了许多博客,总结了一下,总算是明白了。

    什么是宏任务、微任务

    先来了通俗易懂的例子:
    去银行办理业务的人就是一个个宏任务,当宏任务P1在柜台办理业务时,其它任务都需等待,当一个宏任务P1办理业务结束时,柜台职员会询问他还有没有其它微任务,如果他还有其他业务,则其他宏任务都需等待。就是微任务是在宏任务之前执行。

    宏任务、微任务有哪些

    宏任务包括:script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。

    微任务包括: Promises, Object.observe, MutationObserver

    宏任务、微任务的执行顺序

    执行顺序:先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕。

    实例剖析

    • 例1
    setTimeout(function(){
    	console.log('1');
    });
    new Promise(function(resolve){		    
    	console.log('2');
    	resolve();
    }).then(function(){		    
    	console.log('3');
    }); 		
    console.log('4');
    
    1. 遇到setTimout,异步宏任务,放入宏任务队列中;
    2. 遇到new Promise,new Promise在实例化的过程中所执行的代码都是同步进行的,所以输出2
    3. 而Promise.then中注册的回调才是异步执行的,将其放入微任务队列中
    4. 遇到同步任务console.log(‘4’);输出4;主线程中同步任务执行完
    5. 从微任务队列中取出任务到主线程中,输出3,微任务队列为空
    6. 从宏任务队列中取出任务到主线程中,输出1,宏任务队列为空,结束~

    控制台测试一下,输出2 4 3 1;符合预期

    1. 例2
    setTimeout(()=>{
      new Promise(resolve =>{
      	resolve();
      }).then(()=>{
      	console.log('test');
      });
    
      console.log(4);
    });
    
    new Promise(resolve => {
      resolve();
      console.log(1)
    }).then( () => {
      console.log(3);
      Promise.resolve().then(() => {
        console.log('before timeout');
      }).then(() => {
        Promise.resolve().then(() => {
          console.log('also before timeout')
        })
      })
    })
    console.log(2);
    
    1. 遇到setTimeout,异步宏任务,将() => {console.log(4)}放入宏任务队列中;
    2. 遇到new Promise,new Promise在实例化的过程中所执行的代码都是同步进行的,所以输出1
    3. 而Promise.then中注册的回调才是异步执行的,将其放入微任务队列中
    4. 遇到同步任务console.log(2),输出2;主线程中同步任务执行完
    5. 从微任务队列中取出任务到主线程中,输出3,此微任务中又有微任务,Promise.resolve().then(微任务a).then(微任务b),将其依次放入微任务队列中;
    6. 从微任务队列中取出任务a到主线程中,输出 before timeout
    7. 从微任务队列中取出任务b到主线程中,任务b又注册了一个微任务c,放入微任务队列中;
    8. 从微任务队列中取出任务c到主线程中,输出 also before timeout;微任务队列为空
    9. 从宏任务队列中取出任务到主线程,此任务中注册了一个微任务d,将其放入微任务队列中,接下来遇到输出4,宏任务队列为空
    10. 从微任务队列中取出任务d到主线程 ,输出test,微任务队列为空,结束~

    控制台测试输出:1 2 3 before timeout also before timeout 4 test

    展开全文
  • 定时任务的实现

    千次阅读 2018-11-20 09:27:51
     Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。  Quartz 这是一个功能比较强大的的调度器...

    分类:

    •   实现的技术上来分类
    1.   Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
    2.   Quartz 这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
    3.   Spring3.0以后自带的task 可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
    •   作业类的继承方式
    1.   作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask
    2.   作业类即普通的java类,不需要继承自任何基类。
    • 任务调度的触发时机来分,这里主要是针对作业使用的触发器
    1.   每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
    2.   每到指定时间则触发一次,每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean

    用法说明:

    • Quartz
    1. 第一种,作业类继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean。

          第一步:定义作业类

    导入spring的包与Quartz的包
    import org.quartz.JobExecutionContext;  
    import org.quartz.JobExecutionException;  
    import org.springframework.scheduling.quartz.QuartzJobBean;  
    public class MyJob extends QuartzJobBean {  
      
    private int timeout;  
    private static int i = 0;  
    //调度工厂实例化后,经过timeout时间开始执行调度  
    public void setTimeout(int timeout) {  
    this.timeout = timeout;  
    }  
      
    /** 
    * 要调度的具体任务 
    */  
    @Override  
    protected void executeInternal(JobExecutionContext context)  
    throws JobExecutionException {  
      System.out.println("定时任务执行中…");  
    }  
    }  
    

     第二步:spring配置文件中配置作业类JobDetailBean

    <bean name="job1" class="org.springframework.scheduling.quartz.JobDetailBean">  
    <property name="jobClass" value="com.task.MyJob" />  
    <property name="jobDataAsMap">  
    <map>  
    <entry key="timeout" value="0" />  
    </map>  
    </property>  
    </bean>  
    

     第三步:配置作业调度的触发方式(触发器)

    Quartz的作业触发器有两种,分别是
    org.springframework.scheduling.quartz.SimpleTriggerBean
    org.springframework.scheduling.quartz.CronTriggerBean
    第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。
    配置方式如下:
     
    Xml代码 
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
    <property name="jobDetail" ref="job1" />  
    <property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->  
    <property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 -->  
    </bean>  
    第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。
    配置方式如下:
    Xml代码
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
    <property name="jobDetail" ref="job1" />  
    <!—每天12:00运行一次 -->  
    <property name="cronExpression" value="0 0 12 * * ?" />  
    </bean>  
     关于cronExpression表达式的语法参见附录。
    第四步:配置调度工厂 
    Xml代码
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    <property name="triggers">  
    <list>  
    <ref bean="cronTrigger" />  
    </list>  
    </property>  
    </bean>  
     说明:该参数指定的就是之前配置的触发器的名字。
    

     第四步:启动你的应用即可,即将工程部署至tomcat或其他容器。 

    说明:org.springframework.scheduling.quartz.JobDetailBean有两个属性,jobClass属性即我们在java代码中定义的任务类,jobDataAsMap属性即该任务类中需要注入的属性值。

    1. 第二种,作业类不继承特定基类。

       第一步:编写任务类

    public class MyJob{  
    public void doJob2() {  
       System.out.println("不继承QuartzJobBean方式-调度进行中...");  
       }     
    }  
    
    

       第二步:配置作业类

    <bean id="job2"  
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
    <property name="targetObject">  
    <bean class="com.task.MyJob" />  
    </property>  
    <property name="targetMethod" value="doJob2" />  
    <property name="concurrent" value="false" /><!-- 作业不并发调度 -->  
    </bean>  
     说明:这一步是关键步骤,声明一个MethodInvokingJobDetailFactoryBean,
    有两个关键属性:targetObject指定任务类,targetMethod指定运行的方法。
    往下的步骤就与方法一相同了。
    

      第三步:配置作业调度的触发方式(触发器) 

    Quartz的作业触发器有两种,分别是
    org.springframework.scheduling.quartz.SimpleTriggerBean
    org.springframework.scheduling.quartz.CronTriggerBean
    
    第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。
    配置方式如下:
    Xml代码 
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">  
    <property name="jobDetail" ref="job2" />  
    <property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->  
    <property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 -->  
    </bean>  
    
     第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。
    配置方式如下:
    Xml代码 
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
    <property name="jobDetail" ref="job2" />  
    <!—每天12:00运行一次 -->  
    <property name="cronExpression" value="0 0 12 * * ?" />  
    </bean>  
    以上两种调度方式根据实际情况,任选一种即可。
    
    第四步:配置调度工厂 
    Xml代码  
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    <property name="triggers">  
    <list>  
    <ref bean="cronTrigger" />  
    </list>  
    </property>  
    </bean>  
    说明:该参数指定的就是之前配置的触发器的名字。
    

    第四步:启动你的应用即可,即将工程部署至tomcat或其他容器。

    说明:可以看出Quartz的配置看上去还是挺复杂的,没有办法,因为Quartz其实是个重量级的工具,如果我们只是想简单的执行几个简单的定时任务,有没有更简单的工具,有!那就是Spring task使用注解的@Scheduled

    • spring task

           第一种:配置文件方式

    第一步:编写作业类
    即普通的pojo,如下:
    import org.springframework.stereotype.Service;  
    @Service  
    public class TaskJob {  
          
        public void job() {  
            System.out.println(“任务进行中。。。”);  
        }  
    }  
    
    xml中加入:xsi:schemaLocation="http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
    
     <task:scheduled-tasks>   
            //设置任务和时间
            <task:scheduled ref="taskJob" method="job1" cron="0 * * * * ?"/>   
     </task:scheduled-tasks>  
      
    <context:component-scan base-package=" com.task " />  
    
    


           第二种:使用注解形式 

    使用注解@Scheduled
    @Component(“taskJob”)  
    public class TaskJob {  
        @Scheduled(cron = "0 0 3 * * ?")  
        public void job1() {  
            System.out.println(“任务进行中。。。”);  
        }  
    }  
    
    <!—开启这个配置,spring才能识别@Scheduled注解   -->  
        <task:annotation-driven scheduler="qbScheduler" mode="proxy"/>  
        <task:scheduler id="qbScheduler" pool-size="10"/>  
    说明:理论上只需要加上<task:annotation-driven />这句配置就可以了,这些参数都不是必须的。
    
    
    
    或者springboot 主程序上加上 @EnableScheduling注解开启定时任务

    cronExpression的配置说明
    字段   允许值   允许的特殊字符
    秒    0-59    , - * /
    分    0-59    , - * /
    小时    0-23    , - * /
    日期    1-31    , - * ? / L W C
    月份    1-12 或者 JAN-DEC    , - * /
    星期    1-7 或者 SUN-SAT    , - * ? / L C #
    年(可选)    留空, 1970-2099    , - * / 
    - 区间  
    * 通配符  
    ? 你不想设置那个字段
    下面只例出几个式子
     
    CRON表达式    含义 
    "0 0 12 * * ?"    每天中午十二点触发 
    "0 15 10 ? * *"    每天早上10:15触发 
    "0 15 10 * * ?"    每天早上10:15触发 
    "0 15 10 * * ? *"    每天早上10:15触发 
    "0 15 10 * * ? 2005"    2005年的每天早上10:15触发 
    "0 * 14 * * ?"    每天从下午2点开始到2点59分每分钟一次触发 
    "0 0/5 14 * * ?"    每天从下午2点开始到2:55分结束每5分钟一次触发 
    "0 0/5 14,18 * * ?"    每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 
    "0 0-5 14 * * ?"    每天14:00至14:05每分钟一次触发 
    "0 10,44 14 ? 3 WED"    三月的每周三的14:10和14:44触发 
    "0 15 10 ? * MON-FRI"    每个周一、周二、周三、周四、周五的10:15触发 

    展开全文
  • JavaScript 宏任务和微任务

    千次阅读 2019-10-11 11:49:28
    JavaScript 宏观任务和微观任务 概念 宏观任务:宿主发起的任务为宏观任务,如setTimeout、setInterval、setImmediate,I/O 微观任务:JavaScript引擎发起的任务为微观任务,如Promise JavaScript引擎等待宿主环境...
  • YARN任务提交流程

    千次阅读 2017-07-05 09:52:06
    yarn取代了以前hadoop中jobtracker(后面简写JT)的角色,因为以前JT的 任务过重,负责任务的调度、跟踪、失败重启等过程,而且只能运行mapreduce作业,不支持其他编程模式,这也限制了JT使用范围,而yarn应运而 生...
  • SpringBoot定时任务的使用 一、使用Spring Task 1.引入依赖 首先在我们pom.xml文件中引入spring-boot-starter依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId...
  • 下方:将任务栏按钮显示在“打开了窗口的任务栏”
  • win10经过周年更新后,不少用户碰到任务栏卡死的现象,右击任务栏无任何反应,这多是由资源管理器运行异常、右键菜单设置不当等因素导致的,下面就和大家分享win10任务栏卡死的解决方法。  方法一、  按ctrl+...
  • Linux 查看所有定时任务

    万次阅读 2018-06-26 14:48:30
    crontab命令选项基本只有对用户操作的选项: ...-l 列出某个用户的任务计划 -r 删除某个用户的任务 -e 编辑某个用户的任务 所以,要查看所有用户的,只能根据/etc/passwd文件中的用户名一一枚举了,可以用脚本。...
  • 查看Oracle数据库的定时任务

    万次阅读 2018-06-07 16:54:37
    当前用户定时任务select count(*) from user_jobs;有权限访问的定时任务select count(*) from all_jobs;整个数据库所有定时任务select count(*) from dba_jobs;
  • 最近迅雷极速版bt下载许多任务出现-任务出错,通过修改hosts文件可以绕过迅雷的解析服务器,方法如下: windows系统进入目录C:\Windows\System32\drivers\etc\,用记事本hosts文件, 加入如下一行: #127.0.0.1 hub...
  • win7系统本身无法设置该功能(目前我是不知道哦,...第二部:安装完在扩展屏幕上便会出现任务栏 第三步:在扩展屏下任务栏中右击属性来设置相关的功能。  比如显示Windows按键 这样便解决了两个屏幕双任务栏的功能了。
  • project小技巧:如何删除摘要任务

    万次阅读 2010-05-15 22:03:00
    如果需要删除摘要任务,但要保留它下面的子任务,直接选中摘要任务进行删除,将会导致它下面的子任务也随之删除。在一些复杂的项目中,如果做这样的操作将会给你项目带来很多麻烦。删除摘要任务的方法,将摘要任务的...
  • 在 /var/spool/mail/root 文件中,有crontab执行日志的记录,用tail -f /var/spool/mail/root 即可查看最近的crontab执行情况
  • win7下计划任务提示“该任务映像已损坏或已篡改”解决方案 1. 背景 在windows下部署爬虫,经常会用到windows系统自带的任务计划。但是有时候计划任务会出现不预期的错误,发生损坏…如下所示: 具体原因不详...
  •  需要在windows服务器上定时做一些任务,写程序,麻烦,所以采用任务计划程序来运行准备好的bat批处理文件。 步骤: 1.“管理工具” 里面去找“任务计划程序”或者“控制面板”里面去找“计划任务”,或者直接...
  • win10状态下设置任务栏(双屏)

    万次阅读 2018-01-09 17:30:02
    关于双屏显示器,右键点击任务栏,打开任务栏设置,在任务栏属性里找到【多个显示器】属性-->开,【将任务栏按钮显示在】-->所有任务栏,【合并其他任务栏上的按钮】-->任务栏已满时。
  • win10底部任务栏无反应(鼠标一直转圈)

    万次阅读 热门讨论 2019-03-20 11:09:07
    win10底部任务栏无反应(鼠标一直转圈,系统假死) 目录 win10底部任务栏无反应(鼠标一直转圈,系统假死) 方法1 方法2 方法3 方法4: 这实际上是系统卡死了,假死了 方法1 ,最简单,重启电脑(这个我...
1 2 3 4 5 ... 20
收藏数 2,623,606
精华内容 1,049,442
关键字:

任务