A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 大蓝鲸Java 中级黑马   /  2018-3-2 11:38  /  676 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 大蓝鲸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虚拟机内存模型中,分 栈,堆,方法区等
  其中堆是所有的线程共享的。
  但是栈是线程私有的,而方法是加载在栈里面的,当一个方法抛出了一个运行时,那么受影响的只是这个线程的栈
  不会影响到其他线程栈。

2 个回复

倒序浏览
我来占层楼啊   
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马