利用DDMS 查看 分析线程阻塞

来源:互联网 发布:linux桌面操作系统 编辑:程序博客网 时间:2024/04/29 00:30
在实际应用中有可能出现如下场景,在Activity 中,新建后台线程(Thread,或者 AsyncTask) 处理网络请求或者其他耗时的工作,但是 主界面出现卡顿现象,ANR 等。有可能是主线程被阻塞。我们可以利用DDMS 来分析主线程和其他工作线程是否出现阻塞,并找出 阻塞的原因。
   利用DDMS 分析线程主要有如下几个步骤:
   1.将手机连接到 电脑,打开Eclipse 的DDMS 视图。
   2.在Devices视图中选择需要调试的应用程序,如 Contacts.
   3.手机中启动应用程序Contacts
   4.在Devices 视图的工具栏中选择 Update Threads,在右边视图中选择 Threads 选项。这个选项中会记录应用中所有的线程的状态,线程名称为 main的线程是主线程。

   5.在应用程序中进行让UI 出现卡顿的操作,在右边的视图中查看 main 线程,如果线程的状态显示 monitor,这表示 main 线程因为 请求同步锁而处于阻塞状态。点击Refresh 按钮查看线程是因为什么原因而阻塞。

   DDMS 中Threads 的状态的说明
   running – executing application code  – 正在执行应用程序,准确的来说正在处理消息。
   sleeping – called Thread.sleep()  – 执行了Thread.sleep() 方法,线程让出了CPU,正在休眠。
   monitor – waiting to acquire a monitor lock – 在正等待获取一个监听锁,线程被阻塞。
   wait – in Object.wait() – 在Object.wait() 方法中,线程被阻塞。
   native – executing native code  – 执行了原生代码,这个对于 带有消息队列的线程是正常的状态,表示消息队列没有任何消息,线程在native 代码中进行无限循环,直到消息队列中出现新的消息,消息队列才会返回Java 代码处理消息。
   vmwait – waiting on a VM resource – 正在等待一个虚拟机资源
   zombie – thread is in the process of dying  – 该线程已死
   init – thread is initializing (you shouldn’t see this) – 线程正在初始化 (你不会看到这个)
   starting – thread is about to start (you shouldn’t see this either) – 线程正在启动中 (这个你也不会看到)
0 0