1、线程的启动

我们要启动一个线程,就是调用一个线程实例的start方法。让我们来看看start方法的源码:

 1 public synchronized void start() {
 2 
 3  //0值就表示这个线程是新启动的
 4   if(threadStatus!=0) {
 5     throw new IllegalThreadStateException();
 6   }
 7   
 8   //通知线程群,这个线程已经启动,线程群的"没有启动的数量"属性将减一。
 9   group.add(this);
10   
11   boolean started=false;
12   try {
13     start0();//调用本地方法,由操作系统分配一个线程
14     started=true;
15   }finally {
16     try {
17       if(!started) {
18          group.threadStartFailed(this);
19       }
20     }catch(Throwable ignore) {
21       //不做任何事情。如果start0抛出了一个运行时异常它将会放弃调用栈。
22     }
23   }
24 }

 

如果我们像下面一样直接调用run方法:

 1 public class ThreadTest {
 2    public static void main(String[]args) {
 3        MyThread myThread=new MyThread();
 4        myThread.run();
 5        myThread.sleep(1000);
 6        System.out.println(Thread.currentThread().getName());
 7    }
 8 }
 9 
10 
11 class MyThread extends Thread {
12     public void run() {
13        System.out.println("MyThread:"+Thread.currentThread().getName());
14     }
15 }

程序运行结果:

MyThread:main  

main

结论:

调用run并没有产生一个新的线程当中,它们还是处于同一个main线程当中。

这也说明新的线程并不是由程序员产生的,只是程序员调用start方法,当程序运行到start方法末尾时,start方法就结束了。新的线程是由JVM间接产生并去调用run方法。

如果我们直接调用run方法与普通的方法调用无异。

posted on 2015-05-26 09:51  飞机说之代码也疯狂  阅读(226)  评论(0编辑  收藏  举报