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;
}
}