一个线程对象生成 后,若是要产生一个执行的线程,就必定要调用它的start()方法.在介绍这个方法时不得不一样时说明run方法.其实线程对 象的run方法彻底是一个接口回调方法,它是你这个线程对象要完成的具体逻辑.简单说你要作什么就你在run中完成,而如何作,何时作就不须要你控制 了,你只要调用start()方法,JVM就会管理这个线程对象让它产生一个线程并注册到线程处理系统中。程序员
从表面上看,start()方法调用了run()方法,事实上,start()方法并无直接调用run方法.在JDK1.5之前 start()方法是本地方法,它如何最终调用run方法已经不是JAVA程序员所能了解的.而在JDK1.5中,原来的那个本地start()方法被 start0()代替,另个一个纯JAVA的start()中调用本地方法start0(),而在start()方法中作了一个验证,就是对一个全局变量 (对象变量)started作检验,若是为true,则start()抛出异常,不会调用本地方法start0(),不然,先将该变量设有true,而后 调用start0()。安全
从中咱们能够看到这个为了控制一个线程对象只能运行成功一次start()方法.这是由于线程的运行要获取当前环境,包括安全,父线程的权限, 优先级等条件,若是一个线程对象能够运行屡次,那么定义一个static 的线程在一个环境中获取相应权限和优先级,运行完成后它在另外一个环境中利用原来的权限和优先级等属性在当前环境中运行,这样就形成没法预知的结果.简单说 来,让一个线程对象只能成功运行一次,是基于对线程管理的须要。并发
start()方法最本质的功能是从CPU中申请另外一个线程空间来执行 run()方法中的代码,它和当前的线程是两条线,在相对独立的线程空间运行,也就是说,若是你直接调用线程对象的run()方法,固然也会执行,但那是 在当前线程中执行,run()方法执行完成后继续执行下面的代码.而调用start()方法后,run()方法的代码会和当前线程并发(单CPU)或并行 (多CPU)执行。spa
因此请记住一句话:调用线程对象的run方法不会产生一个新的线程,虽然能够达到相同的执行结果,但执行过程和执行效率不一样。线程