Chinaunix首页 | 论坛 | 博客
  • 博客访问: 271773
  • 博文数量: 124
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 21
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-20 14:44
文章分类

全部博文(124)

文章存档

2020年(1)

2018年(2)

2016年(2)

2015年(6)

2014年(10)

2013年(23)

2012年(7)

2011年(18)

2010年(15)

2009年(8)

2007年(8)

2006年(23)

2005年(1)

我的朋友

分类: Java

2014-01-11 16:40:13

根据java的sdk说明,当调用一个线程的stop时(暂时不管该不该使用该方法),线程会立即退出,但是下面的却没有,是什么原因呢?

点击(此处)折叠或打开

  1. package java_jni;
  2. public class Main {
  3.     public static void main(String []args){
  4.         try {
  5.             Thread t = new Thread() {
  6.                 public synchronized void run() {
  7.                     try {
  8.                         Thread.sleep(100000);
  9.                     } catch (Throwable ex) {
  10.                         System.out.println("Caught in run: " + ex);
  11.                         ex.printStackTrace();
  12.                     }
  13.                 }
  14.             };
  15.             t.start();
  16.             // Give t time to get going...
  17.             Thread.sleep(100);
  18.             t.stop(); // EXPECT COMPILER WARNING
  19.         } catch (Throwable t) {
  20.             System.out.println("Caught in main: " + t);
  21.             t.printStackTrace();
  22.         }
  23.     }
  24. }
运行该程序,然后用jstack输出堆栈;结果如下:为了方便,我只留下main 和 thread0的堆栈信息;

点击(此处)折叠或打开

  1. "Thread-0" prio=10 tid=0x00007f31240aa000 nid=0x1408 waiting on condition [0x00007f3121fe0000]
  2. java.lang.Thread.State: TIMED_WAITING (sleeping)
  3. at java.lang.Thread.sleep(Native Method)
  4. at java_jni.Main$1.run(Main.java:16)
  5. - locked <0x00000000d70e5be8> (a java_jni.Main$1)



  6. "main" prio=10 tid=0x00007f3124007800 nid=0x13fb waiting for monitor entry [0x00007f312bf79000]
  7. java.lang.Thread.State: BLOCKED (on object monitor)
  8. at java.lang.Thread.stop1(Thread.java:819)
  9. - waiting to lock <0x00000000d70e5be8> (a java_jni.Main$1)
  10. at java.lang.Thread.stop(Thread.java:758)
  11. at java_jni.Main.main(Main.java:26)

由上可见,main线程中调用t.stop的时候在等一个所,而这个锁被thread-0 锁住了。再次阅读源码,发现上面实现的run方法,前面有了synchronized; 而在看看java的源码:果然如此;

点击(此处)折叠或打开

  1. @Deprecated
  2.     public final void stop() {
  3.         // If the thread is already dead, return.
  4.     // A zero status value corresponds to "NEW".
  5.     if ((threadStatus != 0) && !isAlive()) {
  6.      return;
  7.     }
  8.     stop1(new ThreadDeath());
  9.     }

  10. private final synchronized void stop1(Throwable th) {



阅读(7958) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~