示例线程sleep执行过程解析

来源:互联网 发布:好找工作的专业知乎 编辑:程序博客网 时间:2024/05/16 12:08

//测试用sleep方法时线程的执行过程

package thread.test;

import java.util.Date;

public class Test4ThreadMethod {
 public static void main(String[] args) {
  MyThread thread = new MyThread();
  thread.start();
  
  try {
   Thread.sleep(10000);
  } catch (InterruptedException e) {
  }
  thread.interrupt();
 }
}

//为了测试方便选择继承Thread,推荐使用实现Runnable接口方式

class MyThread extends Thread{
 public void run(){
  while(true){
   System.out.println("------" + new Date() + "--------");
   try{
    sleep(1000);
   }catch(InterruptedException e){
    System.out.println("thread is over");
    return;
   }
  }
 }
}

==================输出结果如下==========================

------Sun Sep 01 10:43:31 CST 2013--------
------Sun Sep 01 10:43:32 CST 2013--------
------Sun Sep 01 10:43:33 CST 2013--------
------Sun Sep 01 10:43:34 CST 2013--------
------Sun Sep 01 10:43:35 CST 2013--------
------Sun Sep 01 10:43:36 CST 2013--------
------Sun Sep 01 10:43:37 CST 2013--------
------Sun Sep 01 10:43:38 CST 2013--------
------Sun Sep 01 10:43:39 CST 2013--------
------Sun Sep 01 10:43:40 CST 2013--------
thread is over

        当前是两个线程在并行执行(实际是轮换执行,但CPU太快了看似是并行执行的):main线程(即常说的主线程)和MyThread线程。这两个线程互抢CPU时间片,不一定是均等的。

        先简单解释代码含义吧:MyThread线程每隔1秒打印一次当前计算机时间,而main线程则想自己睡10秒。千万不要认为他们是相互影响的,他们谁也不妨碍谁,可以认为是相互独立的。

      注意: 因为这里main线程没有打印输出,所以千万不要认为是MyThread线程先执行的,他们谁先执行时随机的。如果想试试是否这样,你可以设断点每步跟一下。

     他们是这样跑的:MyThread线程跑他自己的,main线程也跑他自己的。一旦main线程抢到时间片就会执行它,可不巧的是它拥有了时间片却要睡10秒,那不好意思啦,它马上进入睡眠状态,即阻塞状态,只有等到阻塞解除才有资格进入就绪状态和MyThread线程抢时间片。这时MyThread线程很高兴获得了10秒的时间片,MyThread线程执行,

正执行着呢,又遇到thread.interrupt();,就是说MyThread线程被打断,MyThread线程自己逮着这个异常了,那么他自己就执行自己的try...catch()..进行结束。此时还没有完,
MyThread线程你结束了我main线程还没结束呢,一直等到main线程结束才算真正的结束了,但MyThread线程已经做出了结束的动作。

    简单的还可以这么理解:只有俩线程在跑,谁跑完了谁就停了,(当然这只限于非死循环的线程,)谁遇到事(异常等)谁自己解决,解决的结果一般是谁也不要影响谁(除了return)。

    本文有很多不足之处,希望大家批评指正!