获取当前线程状态

先来看下面这句代码:
String msgToPrint = Thread.currentThread().getStackTrace()[3] .getMethodName();
输出的结果很简单,就是调用时的方法名。

其中使用的Thread类的第一个方法:
public static Thread currentThread()
返回当前线程对象。

第二个方法:(阅读Java SE的文档)
public StackTraceElement[] getStackTrace()
返回一个堆栈轨迹元素的数组,代表了这个线程的堆栈情况。
如果发生以下三种情况下,getStackTrace()返回的数组长度为0

  1. 这个线程没有被开启;
  2. 这个线程被开启了但是没有被系统运行过(因为线程运行是需要根据一定规律轮换的)
  3. 这个线程结束了。

如果返回的数组长度不为0,那么数组的第一个元素代表栈顶元素,即是这个调用序列中最recent的方法。数组的最后一个元素代表栈底元素,即调用序列中最远的一个元素。

我们写个Android代码测试一下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //用一个私有方法,输出调用堆栈的信息
        printStackInfos();
    }

    private void printStackInfos() {
        StackTraceElement[] stackTraceElements = Thread.currentThread()
                .getStackTrace();

        System.out.println("Called in printStackInfos() method!!!!!!!");
        System.out.println("The stackTraceElements length: "
                + stackTraceElements.length);
        for (int i = 0; i < stackTraceElements.length; ++i) {
            System.out.println("----  the " + i + " element  ----");
            System.out.println("toString: " + stackTraceElements[i].toString());
            System.out.println("ClassName: "
                    + stackTraceElements[i].getClassName());
            System.out.println("FileName: "
                    + stackTraceElements[i].getFileName());
            System.out.println("LineNumber: "
                    + stackTraceElements[i].getLineNumber());
            System.out.println("MethodName: "
                    + stackTraceElements[i].getMethodName());
        }
    }
}

输出结果


堆栈输出信息

可以清楚地看到,当获取stack trace的语句放在另一个方法(工具类方法)中的时候,数组索引为3的元素可以找到该工具类方法的调用地点。
在此例中,找到的是onCreate()方法中的第12行。

代码截图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,351评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,854评论 18 139
  • いちyichi 1 さんsan 3 よん yon 4 ろくroku 6 ななnana 7 おはようohayou m...
    水泥儿阅读 269评论 4 0
  • 以前总是付费看别人的小说,从来没有想过自己有一天也会动手写小说。上个月加了一个扣扣群,群里的成员都是写小说的作者...
    棒棒糖公子阅读 356评论 0 0