我在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。我认为其余代码以某种方式阻止了代码。
答案 0 :(得分:0)
如果您可以获取线程对象,请尝试使用thread.setPriority()以设置较低的优先级。这样你会发现它是否因为另一个线程阻塞而进入WAIT模式
答案 1 :(得分:0)
根据堆栈跟踪,com.koushikdutta.async.AsyncServer.run
正在调用java.util.concurrent.Semaphore.acquire
,并且它在信号量上阻塞。线程正在等待另一个线程释放信号量。
Dalvik WAIT
线程状态实际上是一个调用Object.wait()
的线程。有关完整的线程状态引用,请参阅this post。