【问题标题】:Thread automatically going to WAIT state in android线程在android中自动进入WAIT状态
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多