本帖最后由 大蓝鲸Java 于 2018-3-2 11:52 编辑
【南京校区】线程栈
利用代码,先抛出一个问题:
[AppleScript] 纯文本查看 复制代码 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");
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("run");
throw new RuntimeException("problem");
}
}
问:结果是什么?
有的同学不经要想,既然已经抛出了一个运行时,那么虚拟机肯定要崩溃了。 可是结果真是这样吗? 截图如下:
我们发现不管运行多少次,都是上面的结果,最多就是上下顺序不同而已。
因为main线程的优先级较高,所以我们修改一下代码,让main线程等会。
修改代码如下:
[AppleScript] 纯文本查看 复制代码 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");
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("run");
throw new RuntimeException("problem");
}
}
在main线程中添加了一个睡眠时间。
运行后,我们发现,不管结果如何运行,结果还是跟上面截图一样,只是上下顺序不同而已。
那为什么呢?
在java虚拟机内存模型中,分 栈,堆,方法区等
其中堆是所有的线程共享的。
但是栈是线程私有的,而方法是加载在栈里面的,当一个方法抛出了一个运行时,那么受影响的只是这个线程的栈
不会影响到其他线程栈。
|