有什么办法,让方法执行到某句,时停止执行,2分钟后再执行

快速开发师 发布于 2016/11/10 17:07
阅读 411
收藏 0

有什么办法,让方法执行到某句,时停止执行,2分钟后再执行?

1、使用Thread.sleep让线程挂起,但这明显是在浪费线程,服务器压力估计不小,淘汰之

2、把方法拆分成2部分,将你要停止的某句以下的未执行的部分分离出去形成一个方法B,当执行到你要停止的某句,就把所有接下来要运行的参数,全部存入数据库,形成一个任务,然后结束该方法。 

java启动一个扫描线程来扫描超过2分钟的数据库任务,提取参数,传入到下半截方法里B继续执行

method(){

   A

    ----------------

   B

}

改:

method(){

   A

    ---------------- insert into run_b_param_table values (... runbparam...) 将B方法要运行的运行时参数存储

}

        下半部分分离为runB方法

           runB(runbparam){

               ---------------

            }


线程扫描run_b_param_table 表,当前时间 - insert time >2分钟,运行B部分分离方法,runB(runbparam)


我目前项目采用的第二种,没有办法只能这么做,有没有谁有更高级的手段?

加载中
0
luv
luv
定时器,发信号
0
MZHS
MZHS
你放到数据库里相当于这个任务必定执行,你确定你所有任务在服务器异常或者重启动后还需要执行?

我感觉除了第二种方法没有别的方法了,本来是可能多个线程都要等待两分钟,现在变为一个线程和数据库来管理所有任务,多个线程的活,分配给了一个人,总得有个人干吧。你可以根据任务的紧急成都,来调扫描的频率,或者什么条件下触发扫描线程,而不是一直有个线程在扫描。

快速开发师
快速开发师
2分钟后执行,我是30秒少一次,所以有,2分到2分30秒之间的误差,业务人员从业务上允许了这个误差。我也不可能每秒钟来扫一次以减小这种误差,要那样oracle服务器得崩
0
头号大宝贝
头号大宝贝
Timer timer = new Timer();  
timer.schedule(new MyTask(), 1000 * 120);


需要注意多任务的情况下,时间的设置。timer为单例。

0
抢小孩糖吃
抢小孩糖吃
我的话会采用有限状态机来解决,很明显是碰到某种状态,当前线程挂起2分钟,之后再执行B任务
抢小孩糖吃
抢小孩糖吃
回复 @快速开发师 : 大规模的话,不涉及状态恢复的扔到队列里面,延期执行。缺点是队列较长或者处理能力不足时,无法保证2分钟
快速开发师
快速开发师
大量的用户,几万用户得挂起多少线程,挂线程意味着,线程之前的堆栈状态内存并不能消失,因为你还要继续运行,几万用户。执行这个方法的我们姑且2分钟200个,你要挂200个线程,服务器无论挂不挂,栈内存,堆内存估计都不好受
0
我_承宇
我_承宇
扔到Redis,设置过期时间2分钟,单独起个线程去跑,拿到到时间的任务就去跑
我_承宇
我_承宇
回复 @快速开发师 : 明显从数据库拿不如从缓存拿效率高,而且redis的单线程保证了不会在恢复任务上出现并发问题
快速开发师
快速开发师
redis倒是一个好注意,目前采用的是暂存oracle数据库表,扫描到并执行完一条,就删除这条并记录到日志表。
返回顶部
顶部