Java 如何';最后';android运行中的块
在android中,对于finally块下的代码:Java 如何';最后';android运行中的块,java,android,Java,Android,在android中,对于finally块下的代码: 1548 finally { 1549 /* 1550 * clean-up everything... 1551 */ 1552 synchronized (sGLThreadManager) { 1553 stopEglSurfaceLocked(); 1554
1548 finally {
1549 /*
1550 * clean-up everything...
1551 */
1552 synchronized (sGLThreadManager) {
1553 stopEglSurfaceLocked();
1554 stopEglContextLocked();
1555 }
1556 }
这是否意味着它将由“FinalizerDamon”运行
当trace.txt显示FinalizerDaemon正在等待引用队列时,这意味着什么
"FinalizerDaemon" daemon prio=5 tid=7 WAIT
| group="system" sCount=1 dsCount=0 obj=0x419d0c60 self=0x50cf3650
| sysTid=3933 nice=0 sched=0/0 cgrp=apps handle=1086157112
| schedstat=( 0 0 0 ) utm=32 stm=9 core=1
at java.lang.Object.wait(Native Method)
- waiting on <0x416da5d0> (a java.lang.ref.ReferenceQueue)
at java.lang.Object.wait(Object.java:401)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169)
at java.lang.Thread.run(Thread.java:856)
“FinalizerDaemon”守护程序prio=5 tid=7 WAIT
|group=“system”scont=1 dsCount=0 obj=0x419d0c60 self=0x50cf3650
|sysTid=3933 nice=0 sched=0/0 cgrp=apps handle=1086157112
|schedstat=(0)utm=32 stm=9 core=1
在java.lang.Object.wait(本机方法)
-等待(java.lang.ref.ReferenceQueue)
在java.lang.Object.wait(Object.java:401)
位于java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:102)
位于java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:73)
位于java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169)
运行(Thread.java:856)
最后
和终结器不相关
finally
是try
-catch
块之后的一个代码块,无论try
-catch
的结果如何,它都将运行。通常,您会在这里找到防止资源泄漏的关键清理代码
清理对象时,垃圾收集器可以运行终结器(对象的finalize()
方法)。但是,你不能保证它们会运行,也不能保证它们以任何顺序运行,等等
FinalizerDamon可能是运行finalize()
方法的线程。在本例中,它听起来像是阻塞了ReferenceQueue
,该队列将保存对符合最终确定条件的对象的引用
值得一提的是,这里没有特定于Android的行为;这只是Java行为。最终在try-catch块的末尾执行,而不管是否发生异常
FinalizerDamon与此无关。它与垃圾收集有关。finally是try/catch块的一部分,无论是否引发异常,它都会运行。FinalizerDamon与垃圾回收有关。如果仅此而已,那么将其放在catch块下面还是放在finally块中就无关紧要了。:)但还有更多:如果@Frank有更多的东西,你需要指出这里有什么。:)最重要的是:你可以使用它而不被捕获,它会一直运行(除非发生可怕的事情)。也包括未捕获的例外情况。此外,如果在代码中的某个地方手动调用“return X”,它仍然会运行finally。因此,对于清理/关闭对象来说,它是完美的:如果未来的开发人员在方法中的某个地方添加了return语句:不用担心,finally仍然会运行。