如何“终结”在Android运行中阻止

时间:2013-02-12 19:47:28

标签: java android

在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)

2 个答案:

答案 0 :(得分:5)

finally和终结者无关。

finallytry - catch块之后的代码块,无论try - catch的结果如何,该块都将运行。通常情况下,您会找到关键的清理代码以防止资源泄漏。

清理对象时,垃圾收集器可以运行终结器(对象的finalize()方法)。但是,你不能保证它们会运行,也不能以任何顺序运行等等。

FinalizerDaemon可能是一个运行finalize()方法的线程。在这种情况下,它听起来像ReferenceQueue上的阻塞,它将保留对有资格最终确定的对象的引用。

对于它的价值,这里没有特定于Android的行为;这只是Java行为。

答案 1 :(得分:5)

最后在try catch块的末尾执行,无论是否发生异常。

FinalizerDaemon与此无关。它与垃圾收集有关。