标签:
我们要启动一个线程,就是调用一个线程实例的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方法与普通的方法调用无异。
标签:
原文地址:http://www.cnblogs.com/feijishuo/p/4529794.html