Java 具有3个线程的ANR-使用锁

Java 具有3个线程的ANR-使用锁,java,android,multithreading,Java,Android,Multithreading,主线程:(“主”优先级=5 tid=1) 在onCreate()中生成ArrayList 创建用于锁定的对象。(锁) 启动一个线程:(“线程-6024”优先级=5 tid=29) 内容如下: public class PainterThread extends Thread{ @Override public void run() { while(true) { synchronized(lock){doMyStuff()} Thread.yield();

主线程:(“主”优先级=5 tid=1)
在onCreate()中生成ArrayList
创建用于锁定的对象。(锁)
启动一个线程:(“线程-6024”优先级=5 tid=29)

内容如下:

public class PainterThread extends Thread{
@Override
public void run() {
    while(true) {
        synchronized(lock){doMyStuff()}
        Thread.yield();
    }
}
还可以使用计时器启动另一个线程(“计时器-1”prio=5 tid=26)

MyTicker:

class MyTicker extends TimerTask{
    @Override
    public void run() {
        synchronized(lock){
            doSomeOtherStuff()
        }
    }
}
整个系统运行良好。
但是:
有时它得到一个ANR

  • 两个线程都运行良好(一个是模拟我的游戏世界 另一个是在表面上绘制(查看)
  • 我让他们跑了很长一段时间(结果很好-动作平稳)
  • 然后我触摸屏幕:
  • 两个线程运行良好-曲面视图正在刷新 好的
  • 其他未刷新的UI组件(我在 runOnUiThread)
几秒钟后(据我所知,应该是5,但有点长):
LogCat:

01-16 18:02:19.320    9279-9279/myPackage W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x420face0)
01-16 18:02:19.380    9279-9279/myPackage V/GAV4﹕ Thread[main,5,main]: Tracking Exception: IllegalStateException (@View:measure:16533) {main}
01-16 18:02:19.380    9279-9279/myPackage V/GAV4﹕ Thread[main,5,main]: Dispatch call queued. Dispatch will run once initialization is complete.
01-16 18:15:20.240    9279-9288/myPackage I/dalvikvm﹕ threadid=3: reacting to signal 3
01-16 18:15:20.350    9279-9288/myPackage I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'
01-16 18:15:24.430    9279-9279/myPackage A/libc﹕ Fatal signal 6 (SIGABRT) at 0x0000025a (code=0), thread 9279 (myPackage)
trace\u myPackage.txt的有趣部分:

01-16 18:02:19.320    9279-9279/myPackage W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x420face0)
01-16 18:02:19.380    9279-9279/myPackage V/GAV4﹕ Thread[main,5,main]: Tracking Exception: IllegalStateException (@View:measure:16533) {main}
01-16 18:02:19.380    9279-9279/myPackage V/GAV4﹕ Thread[main,5,main]: Dispatch call queued. Dispatch will run once initialization is complete.
01-16 18:15:20.240    9279-9288/myPackage I/dalvikvm﹕ threadid=3: reacting to signal 3
01-16 18:15:20.350    9279-9288/myPackage I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'
01-16 18:15:24.430    9279-9279/myPackage A/libc﹕ Fatal signal 6 (SIGABRT) at 0x0000025a (code=0), thread 9279 (myPackage)
主线是:

"main" prio=5 tid=1 WAIT
  | group="main" sCount=1 dsCount=0 obj=0x420fbde0 self=0x420ea490
  | sysTid=6215 nice=0 sched=0/0 cgrp=apps handle=1075671380
  | state=S schedstat=( 16020076685 14431356669 20182 ) utm=1384 stm=218 core=0
  at java.lang.Object.wait(Native Method)
  - waiting on <0x420fbeb0> (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.park(LockSupport.java:157)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:813)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:846)
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1175)
  at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:180)
  at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:256)
  at com.google.android.gms.analytics.x.dY((null):-1)
  at com.google.android.gms.analytics.GoogleAnalytics.dY((null):-1)
  at com.google.android.gms.analytics.ExceptionReporter.uncaughtException((null):-1)
  at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
  at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
  at dalvik.system.NativeStart.main(Native Method)
由计时器计划的线程:

"Timer-1" prio=5 tid=26 MONITOR
  | group="main" sCount=1 dsCount=0 obj=0x42a70438 self=0x4ec3bc80
  | sysTid=6355 nice=0 sched=0/0 cgrp=apps handle=1336864072
  | state=S schedstat=( 1956706646 728161668 2848 ) utm=180 stm=15 core=1
  at myPackage.otherFunctionInSynchronizedBlock(myOtherSource.java:~90)
  - waiting to lock <0x42739230> (a java.lang.Object) held by tid=29 (Thread-6024)
  at myPackage.MyTicker.run(MyTicker.java:76)
  at java.util.Timer$TimerImpl.run(Timer.java:284)
“定时器-1”优先级=5 tid=26监视器
|group=“main”scont=1 dsCount=0 obj=0x42a70438 self=0x4ec3bc80
|sysTid=6355 nice=0 sched=0/0 cgrp=apps handle=1336864072
|state=S schedstat=(1956706646 728161668 2848)utm=180 stm=15 core=1
在myPackage.otherFunctionInSynchronizedBlock(myOtherSource.java:~90)中
-等待锁定tid=29(线程-6024)持有的(java.lang.Object)
运行(MyTicker.java:76)
在java.util.Timer$TimerImpl.run(Timer.java:284)
两种运行方法都需要4毫秒的处理时间

我认为这里发生了什么:

01-16 18:02:19.320    9279-9279/myPackage W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x420face0)
01-16 18:02:19.380    9279-9279/myPackage V/GAV4﹕ Thread[main,5,main]: Tracking Exception: IllegalStateException (@View:measure:16533) {main}
01-16 18:02:19.380    9279-9279/myPackage V/GAV4﹕ Thread[main,5,main]: Dispatch call queued. Dispatch will run once initialization is complete.
01-16 18:15:20.240    9279-9288/myPackage I/dalvikvm﹕ threadid=3: reacting to signal 3
01-16 18:15:20.350    9279-9288/myPackage I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt'
01-16 18:15:24.430    9279-9279/myPackage A/libc﹕ Fatal signal 6 (SIGABRT) at 0x0000025a (code=0), thread 9279 (myPackage)
  • 主线程想要锁定一些东西(我没有在那里锁定任何东西, 但我不知道它在等什么)
  • 我认为它没有等待其他2个线程,因为跟踪 文件上写着:“由tid持有=1(主)”
如果你知道这个问题,请帮助我

编辑:

主线程在接触它之前死亡(其他元素不刷新)。但当我触摸屏幕时,ANR就会出现

"Timer-1" prio=5 tid=26 MONITOR
  | group="main" sCount=1 dsCount=0 obj=0x42a70438 self=0x4ec3bc80
  | sysTid=6355 nice=0 sched=0/0 cgrp=apps handle=1336864072
  | state=S schedstat=( 1956706646 728161668 2848 ) utm=180 stm=15 core=1
  at myPackage.otherFunctionInSynchronizedBlock(myOtherSource.java:~90)
  - waiting to lock <0x42739230> (a java.lang.Object) held by tid=29 (Thread-6024)
  at myPackage.MyTicker.run(MyTicker.java:76)
  at java.util.Timer$TimerImpl.run(Timer.java:284)