定时执行多线程任务

问题描述

如何才能做到,定时启动某一个任务,比如三分钟做一次该任务,目前我用的是spring结合quartz实现了该功能但是,我执行的那个任务的是多线程的,这样会导致什么问题呢,当三分钟到了会自动启动下一个任务,或许你会说concurrent可以控制,可是你错了,前几天我也这么天真的以为是,但是事实不是这样的。我想达到的目的是,下一个任务的启动要看前面那个任务是否结束,而不会三分钟就起来一次,现在碰到的问题是当这个任务不是多线程时,是的会等待前面那个任务执行完毕,然后再起来,可是现在我想用多线程来实现这个任务,这条路还能走通吗?或者是不是应该换其他的一种方法呢?各位高手能不能给一点解决思路啊。

解决方案

解决方案二:
concurrent真的不行么?你的concurrent是怎么用的?试试java.util.concurrent.Semaphore
解决方案三:
楼主说的实际上是多线程的异步执行。如果你需要在web中加载,最简单的可以写一个servlet在web.xml配置为自动加载(或者直接使用监听器listener)加载这个servlet时,你可以用一个timer来每个3分钟启动一个线程,注意!timer要干的事就是每隔3分钟new一个新的线程。如果需要在线程中访问业务层,可以用spring直接注入的:ContextLoaderListener.getCurrentWebApplicationContext().getBean(***Service.class);spring结合quartz应该也能做到异步执行,不过我也不懂,帮顶。
解决方案四:
个人觉得你还是调整定时时间然后加上标示位当每个线程执行完成后设置标示位当下次定时任务启动时判断这些标示位是否都已经完成完成了就开始新一轮任务并重置标示也可以写一个守护线程去监听每个线程的执行情况
解决方案五:
quartz可以设置线程数量,设置成单线程就行了(不过我说的是单独用quartz,整合的不知道有没有)
解决方案六:
设置成单线程楼主就不会在这问了。。。引用4楼soli11722984的回复:

quartz可以设置线程数量,设置成单线程就行了(不过我说的是单独用quartz,整合的不知道有没有)

解决方案七:
设置一个静态变量,在一个任务开始时改变它为false,当结束时设为true,然后在另个线程里判断这个变量,若为false则继续sleep
解决方案八:
可不可以弄一个类似于线程锁的东西?然后还有一个排队标识
解决方案九:
引用5楼ticmy的回复:

设置成单线程楼主就不会在这问了。。。引用4楼soli11722984的回复:quartz可以设置线程数量,设置成单线程就行了(不过我说的是单独用quartz,整合的不知道有没有)

那个单线程是quartz的单线程,不是他要做的事变成单线程,而且quartz还有个有状态JOB,可以记录上一次执行的状态,所以不管你JOB里面是多线程还是单线程工作,quartz还是会排队执行(因为设成单线程了)

时间: 2024-10-21 08:15:12

定时执行多线程任务的相关文章

使用ASP.NET实现Windows Service定时执行任务

我们怎样才能在服务器上使用asp.net定时执行任务而不需要安装windows service?我们经常需要运行一些维护性的任务或者像发送提醒邮件给用户这样的定时任务.这些仅仅通过使用Windows Service就可以完成.Asp.net通常是一个无状态的提供程序,不支持持续运行代码或者定时执行某段代码.所以,我们不得不构建自己的windows service来运行那些定时任务.但是在一个共享的托管环境下,我们并不总是有机会部署我们自己的windwos service到我们托管服务提供商的we

windows定时执行PHP的技巧

windows定时执行PHP相信不少读者(PHP爱好者)在工作.学习的过程中经常抱怨:在WIN如何让PHP定时自动发信呢??如何让MYSQL实现自动备份而无后顾之忧呢??如 果完全依靠手工进行当然也可以实现,但操作上似乎过于繁琐了一点!别着急,利用系统的任务计划程序(Windows 98称之为计划任务)可轻易解决这一问题.这一功能往往被很多用户忽略或者未曾想到:). 所谓任务计划就是由计算机自动调用用户事先设置好的应用程序,从而达到简化用户操作的目的.利用Windows 2000的任务计划程序(

再贴一遍,利用global.asp定时执行ASP

定时|执行 Using the global.asa to schedule ASP code execution.Have you ever had some asp code that needed to execute every once in a while but, you just didn't know how to do it. There is a solution that doesn't involve running any scheduling or scriptin

利用global.asp定时执行ASP

定时|执行 Using the global.asa to schedule ASP code execution.Have you ever had some asp code that needed to execute every once in a while but, you just didn't know how to do it. There is a solution that doesn't involve running any scheduling or scriptin

Linux中使用at命令定时执行一个程序

在windows下有一个还算好用的命令:at    它完成的使命是能够定时执行某个任务,例如:在一个月黑风高的晚上,下载一个电影的时候,但是又不想守着,但是一直守着又不可能,不关机就更对不起人类了   所以,在那时就可以使用at命令叫它在3:00关机,那么命令大概如下:at 3:00 shutdown -s -f   具体的怎么玩儿的自己在windows下的cmd黑框框里输入: at   /? 自己看帮助去吧  现在莫有windows环境,给你们截不了图的 当然,Linux也有这么一个叫at的命

linux下如何定时执行某个程序

最近在unbuntu环境下需要定时执行某个任务,经过一番搜索,总结起来网上的方法主要有两种,每一种应该都有自己的适合场景,分别是使用crontab和在脚本中执行循环并运行sleep命令.crontab的方法在按秒执行会比较麻烦,更适合于间隔时间较长的执行过程.而运行sleep命令适合于时间较短的重复执行. 使用crontab的方法: 使用crontab -e打开编辑模型,在新打开的文件中添加一行代码,代码由6列组成如(1 1 * * * command),每一列分别对应与分钟,小时,日(一个月中

Linux下的Cron定时执行工具使用入门

cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务: /sbin/service crond start //启动服务 /sbin/service crond stop //关闭服务 /sbin/service crond restart //重启服务 /sbin/service crond reload //重新载入配置 你也可以将这个服务在系统启动的时候自动启动: 在/etc/

如何在Weblogic的全局事务执行多线程操作

今天有人提出了一个诡异的要求,要求在全局事务中执行多线程操作.他们 全局事务中涉及两个数据库中的多个表,如果单线程那么走完,相应时间上不满 足要求,说白了就是比较慢,于是提出了这样的要求.从JTA的规范来看, transaction(TX)和thread是密切相关的,TX一般是不能在应用线程间传递的, 即我主线程起一个全局事务,然后我把这个事务传递给其他我新起的线程,单纯 的变量传递没问题,但这个事务是不能被transaction manager(TM)识别的,TM 对TX的管理有他自己的方式.

MySQL定时执行脚本(计划任务)实例

  查看event是否开启 代码如下 show variables like '%sche%'; 将事件计划开启 代码如下 set global event_scheduler =1; 创建存储过程test 代码如下 CREATE PROCEDURE test () BEGIN update examinfo SET endtime = now() WHERE id = 14; END; 创建event e_test 代码如下 create event if not exists e_test