线程运行过程

class MyThread extends Thread
{
 public void run()
 {
  try
  {
   Thread.currentThread().sleep(3000);
  }
  catch(InterruptedException e)
  {
   
  }
  System.out.println("MyThread running");
 }
}
public class ThreadTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  MyThread t=new MyThread();
  t.run();
  t.start();
  System.out.println("Thread Test");
  
 }

}
//写出运行过程


/*当jvm运行ThreadTest类时,就启动了一个主线程
 主线程执行的代码都在main方法中
 第一条语句:MyThread t=new MyThread();
 创建一个线程对象
 
 第二条语句:t.run;
 调用该对象的run()方法,这时只有一个主线程,主线程进入run方法中执行
 当执行到了sleep时,主线程会睡眠3秒,这时的程序是没有任何执行的,cpu是不处理的
 当3秒过后,主线程有获得了执行资格,并获得执行权后,执行输出语句,打印MyThread running
 
 第三句:t.start()
 开启一个线程,这时程序就多了一条执行路径,该线程要执行的代码都在run方法中,这一开启就有了两种情况:
 第一种情况:
 主线程执行完t.start()后还有执行权,继续向下执行,打印输出语句:ThreadTest 这时主线程结束
 这时只有一个线程Thread-0,它就获得了执行权,开始执行run方法,当执行到sleep时,睡眠3秒,这时程序是不被处理的,
 不会运行,当3秒过后,该线程重新获取执行权,继续执行输出语句,打印MyThread running 该线程Thread-0结束,程序结束
 
 第二种情况:
 当主线程执行完t.start()后,开启一个新的线程Thread-0,这时该线程具备了执行资格,有可能同时获取了执行权,那么这时主线程就处于
 临时阻塞状态,也就是主线程具备了执行资格,但是没有了执行权,Thread-0就到Run方法中执行,当执行到sleep时,睡眠3秒,这时Thread-0
 就释放了执行权,同时释放了执行资格,这时主线程就有机会获取了执行权,执行Main方法中的输出语句,打印ThreadTest,主线程结束
 当Thread-0 3秒后,会恢复到临时阻塞状态,具备了执行资格,就有机会获取到执行权,然后执行输出语句,打印MyThread running,程序结束。*/

 

 output:  MyThread running
             Thread Test
             MyThread running
 

 

 

 


 

你可能感兴趣的:(线程,职场,休闲,线程运行过程)