在android中,对于finally块下的代码:
1548 finally {
1549 /*
1550 * clean-up everything...
1551 */
1552 synchronized (sGLThreadManager) {
1553 stopEglSurfaceLocked();
1554 stopEglContextLocked();
1555 }
1556 }
这是否意味着它将由'FinalizerDaemon'运行?
当trace.txt显示FinalizerDaemon正在等待ReferenceQueue时,它是什么意思?
"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)
答案 0 :(得分:5)
finally
和终结者无关。
finally
是try
- catch
块之后的代码块,无论try
- catch
的结果如何,该块都将运行。通常情况下,您会找到关键的清理代码以防止资源泄漏。
清理对象时,垃圾收集器可以运行终结器(对象的finalize()
方法)。但是,你不能保证它们会运行,也不能以任何顺序运行等等。
FinalizerDaemon可能是一个运行finalize()
方法的线程。在这种情况下,它听起来像ReferenceQueue
上的阻塞,它将保留对有资格最终确定的对象的引用。
对于它的价值,这里没有特定于Android的行为;这只是Java行为。
答案 1 :(得分:5)
最后在try catch块的末尾执行,无论是否发生异常。
FinalizerDaemon与此无关。它与垃圾收集有关。