他为了实现一个定时任务的功能,因为他说 spring 的定时任务不好用,每次跑着跑着就没了,所以想出来这种写个死循环,然后执行一次就休眠一段时间的方法,但是我看 IDE 都会报警告,说禁止在循环里写 Thread.sleep ,我在 stackoverflow 上看了好多解释的帖子,说很浪费资源,发给他看,他之前说这样写不会浪费资源,看了帖子后又说浪费点资源没事,主要是这样实现的定时任务很稳定,求老哥们的意见,这样到底有没有问题?
1
yaphets666 2021 年 12 月 1 日
不管有没有问题,听你领导的就行了,他负总责。
|
2
Leonard 2021 年 12 月 1 日
不要教老大做事🐶
|
3
chir0n 2021 年 12 月 1 日 以后性能优化的时候会有用的。
|
4
simonlu9 2021 年 12 月 1 日 spring 的定时任务不好用,每次跑着跑着就没了,是因为默认配置的线程池只有一个线程,所以有时候执行不了,自己额外配一下线程池就可以了
|
5
qwerthhusn 2021 年 12 月 1 日
主要看 sleep 多久,如果 sleep 1 秒以上。那线程切换占用的一点 CPU 资源都可以忽略不计了
|
6
kop1989 2021 年 12 月 1 日
有问题,但是没准更适合你们的场景和成本。
|
7
securityCoding 2021 年 12 月 1 日 via Android
@simonlu9 spring 这个机制的确非常坑
|
8
Aliberter OP @yaphets666 学会了,老哥职场高人
|
10
rsyjjsn 2021 年 12 月 1 日
小心下次分配给你的任务
|
13
Aliberter OP @qwerthhusn sleep 时间挺长的,但我以为这种写到循环里的话,会持续占据资源不会切换呢
|
14
polobug 2021 年 12 月 1 日
你能解决岂不是更好= =当然你不能解决的话。。那总得用把
|
15
shenlanAZ 2021 年 12 月 1 日
我的前老大还写过 System.gc(); 呢。
他写的代码让他自己负责,除非要你来全权维护,你可以改成你认为可行的方法。 |
17
sagaxu 2021 年 12 月 1 日 via Android 大佬明年一出手,性能提升十倍,对内 PPT 谈 KPI ,对外分享重构案例
|
18
Aliberter OP @shenlanAZ 我老大是代码可以是他写,但问题一般要追究到我们头上,他不负责,即使我们说之前是你让这么做的,那么他也会说是你当时听错了,然后当即给你提出一种新的方法,让你去改,就是死活不承认自己有错误这种,就因为这种风格底下已经被气的离职了两个了,现在项目也是一团糟,唉
|
20
WytheHuang 2021 年 12 月 1 日
@Aliberter #18 这还不提桶跑路, 着实不要脸了。
|
21
Aliberter OP @WytheHuang 我着实想跑了,可是才入职半年,而且也年底了,唉,先忍忍吧,明年来了看情况开溜
|
22
gadfly3173 2021 年 12 月 1 日
在循环里写 sleep 也不是不能接受的,比如一些循环调用第三方 api 的,为了防止执行过快碰到 api 的 qps 上限,加个 sleep 简单有效
|
24
Aliberter OP 老哥们,点击量高我有点心慌啊,毕竟吐槽老大了,一会我删帖了哈
|
28
Aliberter OP @gadfly3173 ok 明白了 谢谢老哥
|
31
Aliberter OP @0312birdzhang 说起 gc ,我们现在这个项目,分了 4 个 G 的内存,线程数太多,将近 300 多个,平均每 0.19 秒就要 gc 一次,部署了两天已经 gc 三万多次了,这是不是要炸了啊。。我感觉已经无法直视了,
|
33
tabris17 2021 年 12 月 1 日
具体问题具体分析,就一个线程,也不是频繁切换,这么搞完全没问题
|
35
Aliberter OP 老哥们,暂停回复吧,我要搬砖了,谢谢大家哈~
|
36
luozhiyun 2021 年 12 月 1 日
以我的经验来看,遇到这种事情,最多提醒一次,后面就不要再说了,老大说什么都是对的。你要是觉得在他手上学不到东西,可以跳槽
|
38
ykk 2021 年 12 月 1 日
想了下我也在循环里写过 sleep ,为了协调两个进程的时间,不然一个队列灌太快会被冲掉,至今不理解原因
|
39
bxb100 2021 年 12 月 1 日
while true + sleep 做定时任务没问题啊
|
40
ligiggy 2021 年 12 月 1 日
非 java ,我的 死循环里面好像都加了 thread.sleep(). 就算在线程里面跑,我也加了
|
41
0xZhangKe 2021 年 12 月 1 日
性能问题要有数据对比,你能拿出数据才能证明真的有问题,否则都是空谈。
|
42
xiaoyang7545 2021 年 12 月 1 日
很简单,你能不能有更好的方式来解决现有问题。如果有,就调整一下给他看看是否可以用。如果没有,在那边说这样不行那样不行意义不大。
|
43
ch2 2021 年 12 月 1 日
又不是不能用.jpg
|
44
liudaolunhuibl 2021 年 12 月 1 日
sleep 的问题应该是线程状态切换,唤醒和进入休眠都要耗费 CPU 资源的,但是不是太频繁的话理论上还好,虽然算是野路子但是这也是一种解决办法吧,不过更好的是配置 spring 定时任务线程池或者换成其他的框架比如 XxlJob
|
45
easing 2021 年 12 月 1 日
@Aliberter #13 并不是,sleep 会切换出去的(最后走 futex_wait ),如果 sleep 时间挺长,其实没啥问题。而且确实稳定。
|
46
meeop 2021 年 12 月 1 日
代码工作正常,没有性能问题爱怎么写怎么写,并无不妥
你觉得高级的做法也并不是最佳实践,就算改了,重构后效果和重构前差不多,没啥用 除非,你趁机牵头搞一个公司内部的服务调度框架 /中台 /平台,那还不错 |
47
ForkNMB 2021 年 12 月 1 日
不是 。定时任务为啥要用 Spring 自带的,贼不好用,为啥不用 XXLJOB
|
48
BBCCBB 2021 年 12 月 1 日
4L 正解.
|
49
jackzhengjbs 2021 年 12 月 1 日 via Android
我是你领导,下班之后来我办公室,🐶头
|
50
C603H6r18Q1mSP9N 2021 年 12 月 1 日
正解:写个 内部请求地址,linux crontab 定时调用这个链接
|
51
code4you 2021 年 12 月 1 日 性能优化
以前 Thread.sleep(10000) 优化 Thread.sleep(1000) 再次优化 Thread.sleep(100) 极度优化 Thread.sleep(10) 😁 |
52
corningsun 2021 年 12 月 1 日
@shanghai1998 自己用着爽,运维火葬场。
|
53
Jooooooooo 2021 年 12 月 1 日
sleep 当然不会消耗资源
这当然也是也是一种定时任务的办法 你领导说的不靠谱的现象确实存在, 要是异常没处理好, 定时任务可能就会没了 |
54
Lemeng 2021 年 12 月 1 日
出问题,不用自己负责的事,不操心,呵呵
|
55
zhuangzhuang1988 2021 年 12 月 1 日
@shenlanAZ 强如 scala 老爹的项目 里面也有 System.gc()的, 有时候直接重启
https://github1s.com/lampepfl/dotty/blob/HEAD/language-server/src/dotty/tools/languageserver/DottyLanguageServer.scala#L102 |
57
fangcan 2021 年 12 月 1 日
可以发信息再找他确认下,留下证据
|
58
yousabuk 2021 年 12 月 1 日
犟啥呢,已经出现对你的所有建议看都不看直接否定的情况了。
小心了,对你有意见了已经。 |
60
kaneg 2021 年 12 月 1 日
sleep 是会一直占用当前线程,应该用 object 的 wait 方法。
如果只是用定时,可以用 ScheduledExecutorService |
61
railgun 2021 年 12 月 1 日
符合业务需求就没有问题
|
62
anonymous1024 2021 年 12 月 1 日
如果当前操作系统是抢占式内核,在死循环中写 sleep 是可以放弃 cpu 占用时间的,提高其他程序的命中率。
|
63
C603H6r18Q1mSP9N 2021 年 12 月 2 日
|
64
goalidea 2021 年 12 月 2 日
首先不考虑性能的话,能实现就行,其次 sleep 要考虑多线程的问题,毕竟是要抱着锁去睡觉
|
65
olaloong 2021 年 12 月 2 日
看具体用法吧....我有个 10 秒一次的定时任务就是循环+sleep ,无锁无竞争也不会有啥问题
|
66
oOoOoOoOoOo 2021 年 12 月 2 日 via Android
|