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

จะรับการติดตามสแต็กโดยใช้เธรดใน Java 9 ได้อย่างไร


จาวา 9 ได้เพิ่ม StackWalker คลาสเพื่อจัดเตรียม API มาตรฐานสำหรับการเข้าถึงเธรดสแต็กปัจจุบัน ใน Java เวอร์ชันก่อนหน้า เราสามารถใช้ Throwable::getStackTrace , Thread::getStackTrace และ SecurityManager::GetClassContext วิธีการให้ได้รับกองเธรด

Thread.getStackTrace() เมธอดจะส่งคืนอาร์เรย์ขององค์ประกอบการติดตามสแต็กที่แสดงถึงสแต็กดัมพ์ของเธรด (StackTraceElement[] ). องค์ประกอบแรกของอาร์เรย์แสดงถึงส่วนบนของสแต็ก อาจเป็นการเรียกใช้เมธอดสุดท้ายในลำดับ และองค์ประกอบสุดท้ายของอาร์เรย์แสดงถึงส่วนล่างของสแต็ก อาจเป็นการเรียกใช้เมธอดแรกในลำดับ /P>

ไวยากรณ์

StackTraceElement สาธารณะ[] getStackTrace() 

ตัวอย่าง

<ก่อน>นำเข้า java.lang.StackWalker.Option; GetStackTraceTest คลาสสาธารณะ { โมฆะคงที่สาธารณะหลัก (สตริง args []) { GetStackTraceTest.testPrintCurrnentStackTrace (); GetStackTraceTest.testShowReflectFrames (); } // รับ StackTrace โดยใช้เธรด โมฆะคงที่สาธารณะ testPrintCurrnentStackTrace () { StackTraceElement[] stack =Thread.currentThread().getStackTrace(); สำหรับ (องค์ประกอบ StackTraceElement:กอง) { System.out.println (องค์ประกอบ); } } // SHOW_REFLECT_FRAMES พิมพ์โมฆะคงที่สาธารณะ (StackWalker stackWalker) { stackWalker.forEach (stackFrame -> System.out.printf ("%6d| %s -> %s %n",stackFrame.getLineNumber() , stackFrame.getClassName() , stackFrame.getMethodName() )); } โมฆะคงที่สาธารณะ testShowReflectFrames () { สุดท้าย StackWalker stackWalker =StackWalkergetInstance (ตัวเลือกSHOW_REFLECT_FRAMES ); พิมพ์ (stackWalker); }}

ผลลัพธ์

java.base/java.lang.Thread.getStackTrace(Thread.java:1654)GetStackTraceTest.testPrintCurrnentStackTrace(GetStackTraceTest.java:10)GetStackTraceTest.main(GetStackTraceTest.java:5) 17| GetStackTraceTest -> พิมพ์ 25| GetStackTraceTest -> testShowReflectFrames 6| GetStackTraceTest -> หลัก