作者cyclone350 (老子我最神)
看板java
标题[问题] 两个 Thread 疑问
时间Mon Jan 19 20:57:16 2015
最近写了一个 multi thread 程式
有使用到 ThreadPoolExecutor 之类的东西
也有用到 synchronized method 或是 lock 之类的东西
当然有程式有包含错误处理(try catch),目前使用没遇到状况
不过主管对程式有些看法是我不能理解的,以下模拟对话内容
主管: 万一Thread消失怎麽办?
cyclone350: 消失? Thread 本身如果有错误,有 try catch 作错误处理
Thread 执行最外层也有执行错误处理 (送 mail, 写 log 之类的)
主管: 不,我是说 Thread 消失了,try catch 也不会知道,但是你的程式
却正常执行。
cyclone350: ......?
主管: 你要怎麽确保Thread不会消失? 或是让Thread消失後可以被侦测到?
cyclone350: ...? 若 Thread 发生错误,有错误处理,我不了解消失是...?
主管: 就是Thread消失了,但是JVM没发觉,程式却正常执行的情况
cyclone350: ......? 如果 Thread 从系统里蒸发.. 而JVM却没察觉的话...
我的错误处理并没有防堵这种状况....
主管: 必须想出一种机制能够让别人知道程式是正常运作的
-----------------------------------------------------------
其实我私心觉得这种情况似乎不会发生,就算发生了好像也不会是ap的问题...
如果真的有这种情况发生了,那所有 multi thread 程式不就不用玩了?
呼叫 synchronized method 後消失... 那整个 application 不就挂点了?
全部都在 wait... lock机制也是一样...
我有去找 ThreadPoolExecutor 的 source code... 我看 Thread 也只是被 worker
包裹起来跑
try {
task.run();
} catch (RuntimeException x) {
thrown = x; throw x;
} catch (Error x) {
thrown = x; throw x;
} catch (Throwable x) {
thrown = x; throw new Error(x);
} finally {
afterExecute(task, thrown);
}
task 跑到一半会消失? 这甚麽道理? try catch 不就形同虚设了吗?
请问在开发 multi Thread 时真的会有这种情况发生吗?
如果真的有这情况,各位大大是怎麽处理?
---------------------
另外想请问程式暂停除了 Thread.sleep 还有其他的方式吗?
我最近有看 apache 某专案设定 time out 是用 Thread.sleep
或是用 while 回圈,里面是 thread.sleep 停止 1 ms 直到时间到为止
不过之後可能会被问一个问题
"万一 Thread.sleep 之後就起不来,然後程式也没跳任何错误
(意味 Exception 及 Error 不会 trigger),怎麽办?"
所以还蛮想找一个替代方案的
-----------------------
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.192.133
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1421672239.A.D34.html
1F:→ mozzan: 我猜他可能对你的写法有些不认同,只是自己又说不上 01/19 22:54
2F:→ mozzan: 我只知道thread会饿死,还没听过会蒸发的 01/19 22:57
3F:推 Killercat: 他想问的是不是「thread跑完了 没通知」这样? 01/20 01:47
4F:→ swpoker: thread是官方提供的,除非vm消失,不然thread是不会消失的 01/20 09:49
5F:→ swpoker: 与其担心会消失,不如担心会dead lock 01/20 09:49
6F:推 ooooooo: 增加timeout机制 01/20 15:52
谢大家回应,结论就是 Thread 不会蒸发 :)
n大及良葛格回应的可能情况在我的程式功能也有处理
另外 mozzan 大大说明的状况我想讨论一下
若 os 的排班制度很差的话,的确有可能全部会饿死 (永远执行不到)
但是以现在的 os 情况,在正常状况下会饿死吗?
我认为是不会的,毕竟 os 已经发展很长一段时间了,
os 开发人员应该会极其避免这种状况且持续精进
所以换句话说,如果你开的Thread会饿死,那 os 也差不多要挂了 (loading到极限)
所以也不会是 ap 层要考虑的状况
以上是我的想法
※ 编辑: cyclone350 (123.193.192.133), 01/20/2015 20:19:26