【发布时间】:2014-05-13 13:27:03
【问题描述】:
我正在 android 中启动一个新线程。该线程的作用是从 MediaCodec 获取输出缓冲区,然后将它们作为 flv 视频流式传输到 Web 浏览器。我遇到的问题是该后台线程在流式传输一些视频后会自动进入等待状态。我可以在android监视器中看到。以下是 Android Monitor 内部线程的日志:
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)
线程进入等待状态的可能原因是什么?
编辑: 我只是以正常方式创建线程。创建一个对象并在该对象上调用 start 函数。该线程的对象立即超出范围。而且我没有办法明确地使线程进入等待状态。顺便说一句,我在那个后台线程上做了一些密集的工作。我只是想问一下线程进入等待状态的原因可能是什么。
我一次又一次地调用这个方法:https://github.com/koush/AndroidAsync/blob/master/AndroidAsync/src/com/koushikdutta/async/AsyncServer.java#L174 并传递我的可运行对象。告诉您该 run 方法中的第一个 if 条件始终为 false。我认为其余代码以某种方式阻塞了代码。
【问题讨论】:
-
对不起,什么是安卓显示器?
-
它显示了您对 Android 设备的见解,例如正在运行的线程、您的应用程序的堆大小,还有 logcat 以及许多其他我不知道的东西。
-
com.koushikdutta.async.AsyncServer.run 是你写的一个类吗?
-
贴一些包含线程和流读取的代码。
-
我正在使用开源库在我的 android 设备上创建服务器。这是 AsyncServer 类:github.com/koush/AndroidAsync/blob/master/AndroidAsync/src/com/…
标签: java android multithreading