开源中文网

您的位置: 首页 > 编程开发 > Java语言设计 > 正文

Java不能使用Thead的stop()方法?

来源:  作者:

  1. /**
  2.  * 为啥不能使用 Thead.stop()? 那又该如何替换? 这里举例说明。
     
  3.  * 
     
  4.  * 还真没细看过Thread的几个方法呢!
     
  5.  * Thread#join():父线程中调用子线程的join()方法,则父线程会被阻塞,直到子线程执行完毕。
     
  6.  * Thread.sleep():线程至少休眠一段时间,然后继续执行。
     
  7.  * Thread.yield():将当前返回等待执行的线程队列中,先执行其他要执行的线程。(貌似在进行优先级安排时可以用到)
     
  8.  * Thread#interrupt():调用该方法时,如果该线程正在运行,会将其标志为interrupted,此时如果调用
     
  9.  * Thread.currentThread().isInterrupted()将返回true。如果线程正在被block,比如(Sleep)
     
  10.  * 则会触发InterruptedException,但不会修改interrupted标志。
     
  11.  * http://download.oracle.com/javase/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html
     
  12.  * http://www.javamex.com/tutorials/threads/yield.shtml
     
  13.  * 
     
  14.  */
     
  15. public class TestThread {
     

  16.  
  17.     public static void main(String[] args) throws InterruptedException {
     
  18.         // 错误的例子(打印了 "FINALLY SO",却未打印 "STOP S0")
     
  19.         if (args.length == 0) {
     
  20.             S0 s0 = new S0();
     
  21.             s0.start();
     
  22.             Thread.sleep(5000);
     
  23.             s0.stop(); // 直接终止线程,且之后的线程代码不会被执行。
     
  24.         } else {
     
  25.             // 推荐的例子(打印了"STOP S1")
     
  26.             S1 s1 = new S1();
     
  27.             s1.start();
     
  28.             Thread.sleep(5000);
     
  29.             s1.interrupt(); // 使用interrupt(),而非 stop();
     
  30.         }
     
  31.     }
     

  32.  
  33.     public static class S0 extends Thread {
     
  34.         public void run() {
     
  35.             int i = 0;
     

  36.  
  37.             int j = 1;
     
  38.             try {
     
  39.                 while (== 1) {
     
  40.                     i++;
     
  41.                     System.out.println(i);
     
  42.                 }
     
  43.             }
     
  44.             // 如果有Catch 则会捕获到 ThreadDeath 这个ERROR。
     
  45.             // 但是它不是一个Exception,大家一般都不会写这样的catch语句的。
     
  46.             // 不能将线程的停止工作完全依赖于这种没有明确规则的编程感觉吧。
     
  47.             // catch (Throwable e) {
     
  48.             // System.out.println("CATCH : " + e.getClass()+" : " +
     
  49.             // e.getMessage());
     
  50.             // }
     

  51.  
  52.             // 如果死循环代码中后有finally块,被stop()之后,该代码会被执行。
     
  53.             finally {
     
  54.                 System.out.println("FINALLY S0");
     
  55.             }
     

  56.  
  57.             // 死循环代码之后的其他语句在被stop()之后将不会被执行。
     
  58.             System.out.println("STOPPED S0");// 这里如果是IO流的close() 会怎样?
     
  59.         }
     
  60.     }
     

  61.  
  62.     // *************************************************************************
     
  63.     // 下面是推荐的例子:
     
  64.     // 1. 如果线程正在运行时被interrupted,则通过Thread.currentThread().isInterrupted()来终止运行。
     
  65.     // 2. 如果线程正在休眠时被interrupted,则只能通过捕获InterruptedException来终止欲行(不能通过方法一)。
     
  66.     // 注意:
     
  67.     // Thread.currentThread().isInterrupted()只会读取当前线程是否被终止。
     
  68.     // 而 Thread.interrupted() 则是先读取当前线程是否被终止,然后会将该被终止标志清除。
     
  69.     // *************************************************************************
     
  70.     public static class S1 extends Thread {
     

  71.  
  72.         public void run() {
     

  73.  
  74.             int i = 0;
     
  75.             try {
     
  76.                 while (!Thread.currentThread().isInterrupted()) {
     
  77.                     i++;
     
  78.                     System.out.println(i);
     

  79.  
  80.                     Thread.sleep(1000);
     
  81.                 }
     
  82.             } catch (InterruptedException e) {
     
  83.                 // TODO
     
  84.             } finally {
     
  85.                 // 做清理工作
     
  86.             }
     
  87.             System.out.println("STOPPED S1 + "
     
  88.                     + Thread.currentThread().isInterrupted());
     
  89.         }
     
  90.         
     

  91.  
  92.         // 如果觉得使用Thread.currentThread().isInterrupted()有些不好理解,
     
  93.         // 也可以while循环时判断自己定义的是否停止标志,如下所示。
     
  94.         // private boolean abort = false;
     
  95.         // public void abort(){
     
  96.         // abort = true;
     
  97.         // }
     
  98.     }
     
  99. }

Tags:方法
关于开源中文网 - 联系我们 - 广告服务 - 网站地图 - 版权声明