线程在android中自动进入WAIT状态

时间:2014-05-13 13:27:04

标签: java android multithreading

我在android中开始一个新线程。这个线程的作用是从MediaCodec获取输出缓冲区,然后将它们作为flv视频流式传输到Web浏览器。我遇到的问题是,在播放部分视频后,后台线程会自动进入等待状态。我可以在android监视器中看到。以下是Android监视器内部线程的日志:

  at java.lang.Object.wait(Native Method)   
  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.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:973)    
  at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1281) 
  at java.util.concurrent.Semaphore.acquire(Semaphore.java:283) 
  at com.koushikdutta.async.AsyncServer.run(AsyncServer.java:190)   
  at in.umairkhan.screencast.cast.FlashDevice$Streamer.encode(FlashDevice.java:86)  
  at in.umairkhan.screencast.cast.EncoderDevice$EncoderRunnable.run(EncoderDevice.java:55)  
  at java.lang.Thread.run(Thread.java:841)  

线程进入WAIT状态的可能原因是什么?

编辑: 我只是以正常的方式创建线程。创建一个对象并在该对象上调用start函数。该线程的对象立即超出范围。并且我无法明确地让线程进入WAIT状态。我在那个后台线程上做了一些密集的工作。我只是想问一下该线程进入WAIT状态的原因是什么。

我一次又一次地调用这个方法:https://github.com/koush/AndroidAsync/blob/master/AndroidAsync/src/com/koushikdutta/async/AsyncServer.java#L174并传递我的runnable的对象。告诉你run run方法中的第一个if条件总是为false。我认为其余代码以某种方式阻止了代码。

2 个答案:

答案 0 :(得分:0)

如果您可以获取线程对象,请尝试使用thread.setPriority()以设置较低的优先级。这样你会发现它是否因为另一个线程阻塞而进入WAIT模式

答案 1 :(得分:0)

根据堆栈跟踪,com.koushikdutta.async.AsyncServer.run正在调用java.util.concurrent.Semaphore.acquire,并且它在信号量上阻塞。线程正在等待另一个线程释放信号量。

Dalvik WAIT线程状态实际上是一个调用Object.wait()的线程。有关完整的线程状态引用,请参阅this post