java main 线程既然被interrupt中断 为什么还会运行后面的

1090人阅读 评论(0) 收藏 举报
分类:
以下转自百度知道:
这是代码:
public class InterruptCheck {
public static void main(String[] args) {
Thread t=Thread.currentThread();
System.out.println("A: isInterrupted="+t.isInterrupted());
t.interrupt();
System.out.println("B: isInterrupted="+t.isInterrupted());
System.out.println("C: isInterrupted="+t.isInterrupted());
try {
t.sleep(2000);
System.out.println("线程没有被中断");
}
catch(InterruptedException x) {
System.out.println("线程被中断了");
}
System.out.println("D: isInterrupted="+t.isInterrupted());
}
}
下图就是结果。
我想问的就是 如图:既然主线程在第5行就被中断了,为什么后面的 B,C,D还会运行呢?
还有就是,为什么到最后的D那段会显示线程又运行了?
麻烦各位了
收起


我觉得这个例子主要涉及到以下几个问题:

1.对interrupt()、isInterrupted()的理解。为什么BCD要运行呢?因为CPU在转线程又没有阻塞也没有转到其他语句,他当然要往下执行。我的理解是interrupt()是抛出一个消息,“要求”调用他的进程中断,他只是负责发出要求,具体执行由其他语句实现。所以这个语句出现进程不会中断。

2. t.sleep(2000)之前,没有语句实现中断,所以这个状态(或者说这个“中断要求”)一直存在, t.sleep(2000)中响应了这个要求(所以你看执行中间【没有】暂停2秒),所以这个状态(或者说这个“中断要求”)就没有了,在D里面就是false了。

3.对异常的理解。那么是怎么实现中断的效果呢?我的理解是通过异常。比如这个例子,发出中断信号过后,你调用t.sleep(2000),这个t.sleep(2000)里面封装了一个东西,他收到了这个信号就向外抛出了一个InterruptedException ,交给try.catch,通过try.catch对异常的转接,【System.out.println("线程被中断了");】就被执行了。其实我觉得你这里不应该输出,而应该写sleep的,因为人家异常是要求你中断。

4.为什么到最后的D那段会显示线程又运行了?这个是对对语句执行的理解问题。方法执行的返回(或者你理解方法里执行的终止)仅限于以下情况:A.执行return语句;B.所有语句执行完毕;C.抛到方法外的异常(run()除外,因为异常不能抛到run()外面去),这里是有异常,但是他没有抛到外面去,所以要继续执行后面的。

总结一下吧,就是语句都是会被执行的,除非你把他的执行顺序改到其他方向去了,或者按照顺序语句执行终了。改顺序的措施包括return(方法里面的语句执行完毕)和通过异常处理选择。

多看看API吧。我的建议是遇到问题就去看API。 

欢迎采纳。


查看评论

关于线程的中断机制

Java中没有提供任何的机制来安全的终止线程,那我们应该怎么让线程停止或者中断呢? java停止或中断线程有下列方式: 1.调用Thread.stop() 2.利用Thread.interrup...
  • YEN_CSDN
  • YEN_CSDN
  • 2016-06-15 13:08:14
  • 2761

中断为什么能结束线程

一个常用但但并不一定能中断线程方法(因为如果此线程阻塞,则前面的判断可能会永远执行不到) package seven; import java.math.BigInteger; import ...
  • jiang_bing
  • jiang_bing
  • 2012-08-02 15:50:41
  • 854

理解java线程的中断(interrupt)

一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果...
  • canot
  • canot
  • 2016-04-07 17:39:33
  • 11098

把某个线程interrupt()后,竟然还继续执行!那这个方法究竟有啥用呢?

public class ThreadInterrupt implements Runnable{ public void run() { for(int i=0;i
  • mnshenyanping
  • mnshenyanping
  • 2014-04-24 21:14:21
  • 887

Java线程的终止——interrupt

取消/关闭的场景我们知道,通过线程的start方法启动一个线程后,线程开始执行run方法,run方法运行结束后线程退出,那为什么还需要结束一个线程呢?有多种情况,比如说: 很多线程的运行模式是死循环...
  • SmuEdward
  • SmuEdward
  • 2017-02-08 10:52:05
  • 1876

停止Java线程,小心interrupt()方法

转自http://www.blogjava.net/jinfeng_wang/archive/2008/04/27/196477.html  程序是很简易的。然而,在编程人员面前,多线程呈现出了一组...
  • wxwzy738
  • wxwzy738
  • 2013-01-18 10:26:36
  • 52463

中断线程详解

在JAVA中,曾经使用stop方法来停止线程,然而,该方法具有固有的不安全性,因而已经被抛弃(Deprecated)。那么应该怎么结束一个进程呢?官方文档中对此有详细说明:《为何不赞成使用 Thr...
  • Erica_1230
  • Erica_1230
  • 2016-05-28 23:06:59
  • 584

线程的暂停与重新启动

调用Thread.Sleep使当前线程阻塞一段时间,休眠,直到调用Thread.Interrupt,另一个线程中断或被Thread.Abrot终止。 注意:一个线程不能对另一个线程Sleep. Th...
  • liuwei1128
  • liuwei1128
  • 2014-03-14 21:38:00
  • 2334

java线程经典理解之Interrupt

 /*  时间:2015年3月12日16:06:24  测试的是Interruput方法,和sleep方法的理解。  先把两个方法的生命摘录如下:   public static voi...
  • lk142500
  • lk142500
  • 2015-03-12 16:48:44
  • 576

Interrupt()方法

关于interrupt(),java的djk文档描述: Interrupts this thread. Unless the current thread is interrupting itsel...
  • u014558484
  • u014558484
  • 2016-09-02 22:29:40
  • 2008
    个人资料
    持之以恒
    等级:
    访问量: 21万+
    积分: 5701
    排名: 5709
    最新评论