Java 線程棧信息詳解

 

windows系統中:
	進程所擁有的內存空間都是獨立的,此進程所持有的內存其它進程是不可以直接訪問的,
	而且在windows系統內部一個進程就是一個運行的運用程序,
	而爲了解決應用程序內部的並行問題便有了線程的概念,線程沒有自我獨立的內存空間,
	在一個進程中所有的線程共享這個進程所持有的內存空間。 
Unix, Linux系統中:
	某些Unix系統當中,進程所持有的內存空間是可以被其他進程進行訪問的,而且一個運用程序可能不止一個進程,
	這樣的系統沒有線程的概念,運用的並行問題有多個進程協調來解決。 

Java爲了實現平臺無關性, 必須解決不同操作系統中進程,線程的差異,因此Java建立了一套自己的進程與線程機制。
	這套機制與windows系統的頗爲相似,但是底層實現確實根據不同平臺的機制進行實現。
	
線程棧:
	線程棧存儲的信息是指某時刻線程中方法調度的信息,當前調用的方法總是位於棧頂。
	當某個方法被調用時,此方法的相關信息壓入棧頂。
	
package com.demo.test;

import com.demo.util.PrinterUtil;

import junit.framework.TestCase;

public class StackTraceTest extends TestCase
{
	public void testThreadInfo()
	{
		printStackTrace();
	}
	
	public static void printStackTrace()
	{
		StackTraceElement[] elements = getCurrentThreadStackInfo();
		
		for(int i=0; i<elements.length; i++)
		{
			PrinterUtil.println("-------------------------------------------------------");
			PrinterUtil.print(elements[i].getClassName() + " --- ");
			PrinterUtil.print(elements[i].getFileName() + " --- ");
			PrinterUtil.print(elements[i].getMethodName() + " --- ");
			PrinterUtil.print(elements[i].getLineNumber() + " --- ");
			PrinterUtil.println("");
		}
	}
	/**	 
	 * 如下方法中:我們可以有兩種方式得到當前線程中棧的信息,
	 * 當我們通過getStackTrace()得到線程棧的信息時,此時線程棧的棧頂存儲的信息就是調用了getStackTrace()方法的信息,
	 * 也就是getCurrentThreadStackInfo()的信息。
	 * @return
	 */
	public static StackTraceElement[] getCurrentThreadStackInfo()
	{
		StackTraceElement[] elements = new Throwable().getStackTrace();
		if(elements == null)
		{
			elements = Thread.currentThread().getStackTrace();
		}
		return elements;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章