我在Android应用程序中看到了ANR。我的主线程的堆栈显示在运行数据库查询时会发生这种情况。根据{{3}}指南,这可能是错误的,应该转移到工作线程。
但是,我想检查一下这个操作是否很慢而且没有死锁。令我感到困惑的是,堆栈显示此线程tid=1
正在等待<0x41788f70>
,这是由tid=1
持有的! 这怎么可能?当然,如果是这个线程持有对象,那么没有必要等待?我在这里缺少什么?
我无法在堆栈转储中的任何其他位置找到对句柄<0x41788f70>
的任何其他引用。
感谢您的帮助。
这是主线程的堆栈:
"main" prio=5 tid=1 TIMED_WAIT
| group="main" sCount=1 dsCount=0 obj=0x41788ea0 self=0x41677588
| sysTid=19868 nice=-11 sched=0/0 cgrp=apps handle=1074336084
| state=S schedstat=( 530094727 210277810 1460 ) utm=36 stm=17 core=1
at java.lang.Object.wait(Native Method)
- waiting on <0x41788f70> (a java.lang.VMThread) held by tid=1 (main)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197)
at android.database.sqlite.SQLiteConnectionPool.waitForConnection(SQLiteConnectionPool.java:735)
at android.database.sqlite.SQLiteConnectionPool.acquireConnection(SQLiteConnectionPool.java:397)
at android.database.sqlite.SQLiteSession.acquireConnection(SQLiteSession.java:905)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:586)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1126)
...
at android.os.Looper.loop(Looper.java:136)