关于java触发器的问题

J2EE 码拜 10年前 (2015-04-21) 1801次浏览 0个评论

今天遇到一个问题:在程序中加入的定时触发器,当时出现这样一个问题,触发器定时2秒,程序从后台查询数据经过复杂处理后时间超过了2秒,我查阅好些网络上说有可能触发器等待程序执行完毕后,在触发下一次,也有说是正在执行的程序被强制停止,然后触发器正常启动触发执行,可是都没有说到一种情况,而这种情况我恰好遇到了,大家也许没加到过,但是很普通,就是触发器正常执行,程序也正常执行,它的执行情况是这样的:首先触发器执行,然后开始正常程序操作,可是操作到一半的时候触发器的时间到了,这时候触发器启动了,再次来了一个线程,但是这个线程属于等待当中,然后继续上一次没有执行完的线程,直到上一次线程执行完毕以后开始执行本次正在等待的线程,然后刚开始一点点的时候触发器时间又到了,然后有开启了一个新的线程,此线程又在等待当中,然后执行上一次线程,上一次还没有执行完(快完的时候)触发器时间又到了,又来了一个线程,现在有两个线程在等待,然后继续前一个线程,前一个线程执行完毕以后,执行最先排队等待的线程。如此类推。最后我执行了进一个小时后等待线程达到了20-30个(没有具体统计,但大体看了一下,差不多了),可奇怪的是,这些直到最后也没有报错,也没有说什么内存不足啊什么的,这些线程都等哪去了?后来我执行了更长时间也没有问题,就是累计了大量的线程等待中,这个问题真是郁闷啊,郁闷点有如下几点:
1、每一次触发器执行的时候都是从头来的,它是怎么记住本次没有执行完毕的线程的而且还准确的记住位置,按道理来说既然触发器启动了,就程序从头开始了,那么前一次线程应该被迫终止啊;
2、这个没有执行完的线程有是被谁记住的?触发器还是java程序的本身的线程池?(我用的定时调度器是quartz2.2.1);
3、难道触发器还有记录进程的作用吗?

我是菜鸟,有高手能不能帮我解答一下这个问题啊,谢谢了

关于java触发器的问题
还有一个问题,后来随着线程的增多,每一个线程执行时间越来越多
关于java触发器的问题
20分
引用 1 楼 u010331620 的回复:

还有一个问题,后来随着线程的增多,每一个线程执行时间越来越多

线程太多了,系统的线程调度开销也越来越大,这是一;二是总的cpu内存等资源是一定的,你线程越多,每个线程分得的资源就越少,自然需要的时间就长了。

关于java触发器的问题
20分
引用 楼主 u010331620 的回复:

1、每一次触发器执行的时候都是从头来的,它是怎么记住本次没有执行完毕的线程的而且还准确的记住位置,按道理来说既然触发器启动了,就程序从头开始了,那么前一次线程应该被迫终止啊;
2、这个没有执行完的线程有是被谁记住的?触发器还是java程序的本身的线程池?(我用的定时调度器是quartz2.2.1);
3、难道触发器还有记录进程的作用吗?

我是菜鸟,有高手能不能帮我解答一下这个问题啊,谢谢了

1、每个线程都是独立的,触发器并没有终止前面那个线程,互不干扰。
2、前面线程暂停是由系统调度的,系统会在适当的时候恢复那个线程运作,所以记住准确位置的是操作系统。
3、线程或者进程调度都是操作系统进行的,与触发器无关,触发器只是触发一下而已。

关于java触发器的问题
那您觉得这个进程要是一直下去会不会因为内存不足而终止呢?我执行了一个多小时了都一直正常执行,就是好像等待的线程越来越多
关于java触发器的问题
引用 4 楼 u010331620 的回复:

那您觉得这个进程要是一直下去会不会因为内存不足而终止呢?我执行了一个多小时了都一直正常执行,就是好像等待的线程越来越多

会占用越来越多的内存,但是如果每个线程占用内存不多,可能短时间看不出来,但长时间肯定出问题的,因为线程数量会不断增加。一般情况下操作系统会平均分配给每个线程一段时间,所以每个线程占用的时间会越来越少,完成执行的时间会越来越长,最终你会得不到结果。由于每个线程执行时间越来越长,而触发器触发新线程的时间不变,也就是随着时间推移,系统资源消耗会越来越快,可能是指数型增长。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于java触发器的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!