的stop(),suspend()以及resume()在java.lang.Thread已被弃用,因为它们是不安全的.Sun推荐的解决方法是使用Thread.interrupt(),但这种方法并不适用于所有情况.例如,如果您调用未明确或隐式检查interrupted标志的库方法,则您别无选择,只能等待调用完成.
所以,我想知道是否有可能描述调用stop()线程(可证明)安全的情况.例如,这将是安全的,stop()一个线程,什么也没做,但通话find(...)还是match(...)一个java.util.regex.Matcher?
(如果有任何Sun工程师正在阅读这篇文章......我将非常感谢您的确切答案.)
编辑:简单地重述您不应该调用的口头禅的答案,stop()因为它已被弃用,不安全,无论什么都缺少这个问题的要点.我知道在大多数情况下它确实是不安全的,并且如果有可行的替代方案,你应该总是使用它.
这个问题是关于安全的子集案例.具体来说,什么是子集?
我是一个Java新手,我想知道,如果我有以下典型的Java代码
public class MyApp {
public static void main(String[] args) {
try {
// do stuff
} catch {
// handle errors
} finally {
// clean up connections etc.
}
}
}
Run Code Online (Sandbox Code Playgroud)
JVM是否保证finally块始终运行?为了理解我来自哪里,我习惯了C/C++程序,如果你取消引用一个NULL指针就可能崩溃,之后就不能运行任何代码了.
但是,由于我理解Java和整个GC /托管内存业务,所以没有空指针解除引用的东西,一切都是可捕获的预期,所以我的程序没有真正的崩溃方式可以让它跳过最后,或者在那里?例如,在Python中,我通常会这样做
try:
# do stuff
except AnExceptionIKnewMightHappen:
# react in an appropriate way
except:
# log that weird error I had not known could happen
Run Code Online (Sandbox Code Playgroud)
我没有通过我的代码就没有任何应用程序死亡.
当然,如果操作系统由于某种原因导致进程终止(或者如果某些东西杀死了整个系统,比如拉动插件),那么Java就无法做到.此外,从PHP我知道你无法防范的非可捕获错误,即使解释器在它发生之后仍然存在(至少它能够输出正确的消息).
编辑:为了清楚起见(这并没有被任何人误解),让我补充一点,我在寻找代码中的内容,这可能会导致最终被绕过.所以指向System.exit是一个有用的提醒,即使我不明白为什么我想要做那样的事情.
退出JVM是一种相当明显的方式,我认为这是一个外部原因.该注释指出你还必须记住在JVM和应用程序继续运行时退出的线程的可能性非常有用,因为即使现在我看起来也很明显,我没有想到它.
如果我有一个带有try/finally部分的函数,并且运行它的线程在try块中被中断,那么finally块是否会在中断实际发生之前执行?