1,什么是线程栈
先说一下基本概念,在JVM虚拟机中有两个非常重要的概念,栈和堆。 栈是线程私有的,堆是所有线程公用的。
1.1利用代码,先抛出一个问题:
1.2问:结果是什么?
有的同学不经要想,既然已经抛出了一个运行时,那么虚拟机肯定要崩溃了。可是结果真是这样吗?
运行如下:
我们发现不管运行多少次,都是上面的结果,最多就是上下顺序不同而已。因为main线程的优先级较高,所以我
们修改一下代码,让main线程等会。 修改代码如下:
public class Demo {
public static void main(String[] args) throws Exception { MyRunnable r = new MyRunnable();
Thread t = new Thread(r);
t.start();
System.out.println("end of method");
}
} p
ublic class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("run");
throw new RuntimeException("problem");
}
} E
xception in thread "Thread‐0" java.lang.RuntimeException:problem at
com.itheima.demo1.MyRunnable.run(Demo.java:19)
at java.lang.Thread.run(Thread.java:745) end of method
public class Demo {
public static void main(String[] args) throws Exception {
MyRunnable r = new MyRunnable();
Thread t = new Thread(r);、
t.start();
Thread.sleep(10);
System.out.println("end of method");
}
} c
lass MyRunnable implements Runnable {
@Override
public void run() {
在main线程中添加了一个睡眠时间。运行后,我们发现,不管结果如何运行,结果还是跟上面一样,只是上下顺
序不同而已。
那为什么呢?
1.3问题解析
在java虚拟机内存模型中,分 栈,堆,方法区等。其中堆是所有的线程共享的。 但是栈是线程私有的,而方法是
加载在栈里面的,当一个方法抛出了一个运行时,那么受影响的只是这个线程的栈,不会影响到其他线程栈。
2,图解
在Java虚拟机中,堆空间是唯一的,但是栈内存是线程独有的,每开启一个线程都会在虚拟机中有一个栈内存空
间。当其中一个栈抛出异常崩溃之后,不会导致其他栈的崩溃。
总结:
堆是所有线程共享的,栈是线程私有的。一个线程运行的所有方法都只会加载在当前线程的线程栈中,栈跟栈之间
是互相独立的。
public void run() {
System.out.println("run");
throw new RuntimeException("problem");
}
}