java线程经典理解之Interrupt


/*
 时间:2015年3月12日16:06:24
 测试的是Interruput方法,和sleep方法的理解。
 先把两个方法的生命摘录如下:
  public static void sleep(long millis) throws InterruptedException;在指定的毫秒内让当前正在执行的线程休眠(暂停执行)
  public static void sleep(long millis, int nanos)
                  throws InterruptedException; 在指定的毫秒内加纳秒内让正在执行的线程休眠(暂时休眠)。
    public void interrupt();中断线程。
  public static boolean isInterrupted();测试当前线程是否已经中断。
  public final boolean isAlive();测试线程是否处于活动状态。如果线程已经启动且尚未终止,则为活动状态。
 currentThread
 public static Thread currentThread();该方法返回当前正在执行线程的引用。
 
 根据该程序运行的结果,可以看出程序的执行流程是这样的:
  先通过继承创建了新的线程m,也就是说程序在执行到m.start()的时候,存在了两条不同的执行路径。
  然后还是执行main线程中的接着三条打印语句。
  然后进入try部分,有可能发生异常。此时当前线程也就是main线程休眠了10000毫秒,也就是10秒钟。
  这十秒钟让其他的线程,在这里,我们可视的是m线程。也就是在这10秒钟,都由m线程单独执行。
  进入m线程的run线程体,程序开始执行m线程。
  定义flag变量,进入while循环,循环体中每次打印一下当前时间。然后当前线程休眠(暂时休眠),因为只休眠1秒钟(而同时main线程要修庙10秒钟)
  所以1秒钟后继续执行m线程的线程体中剩下的部分。…………
  
  10秒过后,主线程不再休眠,开始执行了,
  打印了main线程!
  
  打印当前线程的名字
  打印当前线程(main)是否中断
  打印m线程是否中断
  调用interrupt方法中断m线程,但是此刻main线程仍在运行
  被m线程内的catch捕获
  然后进入catch块
  打印了发生了InterruptedException异常
  打印了打印了InterruptedException异常的栈轨迹
  打印了m是否中断
  可以看出默认的main线程的名字的确就是main
  
*/
import java.util.Date;

public class TestInterrupt {
 public static void main(String[] args) {
  MyThread m = new MyThread();
  m.start();
  System.out.println("main线程。");
  System.out.println(Thread.currentThread().isInterrupted());
  System.out.println(m.isInterrupted());
  try {
   Thread.sleep(10000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  System.out.println("main线程!");
  System.out.println(Thread.currentThread().getName());
  System.out.println(Thread.currentThread().isInterrupted());
  System.out.println(m.isInterrupted());
  m.interrupt();
  
  
 }
}

class MyThread extends Thread {
 public void run() {
  boolean flag = true;
  
  while (flag) {
   System.out.println("--------" + new Date() + "----------------");
   
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    System.out.println("发生了InterruptedException异常");
    e.printStackTrace();
    System.out.println("打印了InterruptedException异常的栈轨迹");
    System.out.println(this.isInterrupted());
    return ;
   }
  }
 }
}
/*
 

main线程。
false
false
--------Thu Mar 12 16:34:31 CST 2015----------------
--------Thu Mar 12 16:34:32 CST 2015----------------
--------Thu Mar 12 16:34:33 CST 2015----------------
--------Thu Mar 12 16:34:34 CST 2015----------------
--------Thu Mar 12 16:34:35 CST 2015----------------
--------Thu Mar 12 16:34:36 CST 2015----------------
--------Thu Mar 12 16:34:38 CST 2015----------------
--------Thu Mar 12 16:34:39 CST 2015----------------
--------Thu Mar 12 16:34:40 CST 2015----------------
--------Thu Mar 12 16:34:41 CST 2015----------------
main线程!
main
false
false
发生了InterruptedException异常
java.lang.InterruptedException: sleep interrupted
        at java.lang.Thread.sleep(Native Method)
        at MyThread.run(TestInterrupt.java:53)
打印了InterruptedException异常的栈轨迹


*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值