获取当前线程状态

作者: looper1211 | 来源:发表于2016-06-09 00:08 被阅读328次

先来看下面这句代码:
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行。

代码截图

相关文章

  • java的线程,实现线程状态

    在Java中,要获取线程的当前状态,请使用Thread.getState()方法获取线程的当前状态。Java提供了...

  • 获取当前线程状态

    先来看下面这句代码:String msgToPrint = Thread.currentThread().getS...

  • 多线程系列06-yield()

    yield():线程让步,能让当前线程由“运行状态”进入到“就绪状态”,从而让其他具有相同优先级的等待线程获取执行...

  • C++ std::this_thread

    命名空间std::this_thread提供了一组关于当前线程的函数。 获取当前线程ID: 放弃当前线程的时间片,...

  • 获取线程状态

    线程执行完毕后不能再次运行,不能再次start()

  • iOS 根据状态栏判断网络状态

    通过顶部状态栏获取当前的网络状态 定义网络状态枚举 获取状态栏上的网络图标 参考这篇iOS 状态栏的图标 获取当前...

  • Java中Sleep和wait的区别

    sleep()方法 sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自...

  • Java 线程sleep()与wait()

    sleep()方法 sleep()使当前线程进入停滞状态(阻塞当前线程),让出CPU的使用、目的是不让当前线程独自...

  • NSThread

    perform系列方法 线程的状态转换 1、如果CPU现在调度当前线程对象,则当前线程对象进入运行状态,2、如果C...

  • Windows内核-远程CALL(劫持线程)

    以劫持线程的方式实现 远程CALL包括劫持原理,代码实现获取主线程挂起线程函数定位恢复线程函数定位获取当前线程RI...

网友评论

    本文标题:获取当前线程状态

    本文链接:https://www.haomeiwen.com/subject/yfbjdttx.html