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