Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีแสดงเฟรมสแต็กทั้งหมดของเธรดปัจจุบันใน Java 9

Stack Walking API ให้กลไกยืดหยุ่นในการเดินและดึงข้อมูลจาก call stacks อนุญาตให้กรองและเข้าถึงเฟรมแบบ lazy StackWalker class เป็น entry point ของ Stack Walking API Stack trace เป็นการแทนของ call stack ณ จุดเวลาหนึ่ง แต่ละ element แทน method invocation มีทุก invocation จากต้นทางของเธรดจนถึงจุดที่สร้าง

ตัวอย่าง: แสดงเฟรมสแต็กทั้งหมดของเธรดปัจจุบัน

import java.lang.StackWalker.StackFrame;
import java.lang.reflect.Method;
import java.util.List;
import java.util.stream.Collectors;

public class StackWalkerTest {
    public static void main(String args[]) throws Exception {
        Method test1Method = Helper1.class.getDeclaredMethod("test1", (Class[])null);
        test1Method.invoke(null, (Object[]) null);
    }
}

// Helper1 class
class Helper1 {
    protected static void test1() {
        Helper2.test2();
    }
}

// Helper2 class
class Helper2 {
    protected static void test2() {
        List<StackFrame> stack = StackWalker.getInstance().walk(
            (s) -> s.collect(Collectors.toList()));
        
        for(StackFrame frame : stack) {
            System.out.println(frame.getClassName() + " " + 
                frame.getLineNumber() + " " + frame.getMethodName());
        }
    }
}

ผลลัพธ์

Helper2 23 test2
Helper1 16 test1
StackWalkerTest 9 main

เมธอดสำคัญของ StackFrame

  • getClassName() - ชื่อคลาส
  • getMethodName() - ชื่อเมธอด
  • getLineNumber() - หมายเลขบรรทัด
  • getFileName() - ชื่อไฟล์
  • getDeclaringClass() - คลาสที่ประกาศ (ต้องการ RETAIN_CLASS_REFERENCE)
  • isNativeMethod() - เป็น native method หรือไม่

StackWalker API ให้ประสิทธิภาพดีกว่า Thread.getStackTrace() เพราะเป็น lazy และ filter ได้