终止一个线程方法

终止一个线程方法

ID:20857930

大小:58.06 KB

页数:23页

时间:2018-10-17

终止一个线程方法_第1页
终止一个线程方法_第2页
终止一个线程方法_第3页
终止一个线程方法_第4页
终止一个线程方法_第5页
资源描述:

《终止一个线程方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、终止一个线程的方法分类:java多线程2008-11-1410:39147人阅读评论(0)收藏举报转自:http://www.java2000.net/p69431.import java.util.*;2.3.public class T {4.  static boolean running = true;5.6.  public static void main(String[] agrs) {7.    Thread a = new Thread(new Runnable() {8.      public void run() {9.        

2、try {10.          while (running) {11.            Thread.sleep(1000);12.            System.out.println("###" + new Date() + "###");13.          }14.        } catch (InterruptedException e) {15.          return;16.        }17.      }18.    });19.    a.start();20.    try {21.      Thr

3、ead.sleep(10000);22.    } catch (InterruptedException e) {}23.    running = false; // 1 此方法使用标志进行,推荐使用24.    // a.stop(); // 2 此方法已经不推荐使用了25.  }26.}来源于:转载自dev2dev网友axman的godeepintojava专栏。不客气地说,至少有一半人认为,线程的“中断”就是让线程停止。如果你也这么认为,那你对多线程编程还没有入门。  在java中,线程的中断(interrupt)只是改变了线程的中断状态,至于这个中

4、断状态改变后带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段。不但不是让线程停止运行,反而是继续执行线程的手段。  对于执行一般逻辑的线程,如果调用它的interrupt()方法,那么对这个线程没有任何影响,比如线程a正在执行:while(条件)x++;这样的语句,如果其它线程调用a.interrupt();那么并不会影响a对象上运行的线程,如果在其它线程里测试a的中断状态它已经改变,但并不会停止这个线程的运行。在一个线程对象上调用interrupt()方法,真正有影响的是wait,join,sleep方法,当然这三个方法包括它们的重载方

5、法。  请注意:[上面这三个方法都会抛出InterruptedException],记住这句话,下面我会重复。一个线程在调用interrupt()后,自己不会抛出InterruptedException异常,所以你看到interrupt()并没有抛出这个异常,所以我上面说如果线程a正在执行while(条件)x++;你调用a.interrupt();后线程会继续正常地执行下去。  但是,如果一个线程被调用了interrupt()后,它的状态是已中断的。这个状态对于正在执行wait,join,sleep的线程,却改变了线程的运行结果。  一、对于wait中等待no

6、tify/notifyAll唤醒的线程,其实这个线程已经“暂停”执行,因为它正在某一对象的休息室中,这时如果它的中断状态被改变,那么它就会抛出异常。这个InterruptedException异常不是线程抛出的,而是wait方法,也就是对象的wait方法内部会不断检查在此对象上休息的线程的状态,如果发现哪个线程的状态被置为已中断,则会抛出InterruptedException,意思就是这个线程不能再等待了,其意义就等同于唤醒它了。  这里唯一的区别是,被notify/All唤醒的线程会继续执行wait下面的语句,而在wait中被中断的线程则将控制权交给了ca

7、tch语句。一些正常的逻辑要被放到catch中来运行。但有时这是唯一手段,比如一个线程a在某一对象b的wait中等待唤醒,其它线程必须获取到对象b的监视锁才能调用b.notify()[All],否则你就无法唤醒线程a,但在任何线程中可以无条件地调用a.interrupt();来达到这个目的。只是唤醒后的逻辑你要放在catch中,当然同notify/All一样,继续执行a线程的条件还是要等拿到b对象的监视锁。  二、对于sleep中的线程,如果你调用了Thread.sleep(一年);现在你后悔了,想让它早些醒过来,调用interrupt()方法就是唯一手段,只

8、有改变它的中断状态,让它从sleep中

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。