run()方法:
在本线程内调用Runnable对象的run()方法,可以重复多次调用。start()方法:
启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程。
这个解释看过好多次了,但是理解不够,现在想想,其实run方法并不是启动线程,而是方法调用,在主线程中调用一个对象的run()方法而已,而start才是真的启动来了一个线程。
看一下代码:
运行结果如下:
或许有人会得出结论,这样启动一个线程是可以的,我们再对程式稍作修改,会发现一个问题:
这里只在主线程中加入了一行代码,打印一行”Printed by main thread”,运行代码,结果如下:
熟练多线程的开发的要发现问题了,为什么”Printed by main thread”会打印在最后一行呢?TestThread类中一直持有时间段吗?
对上面的代码进行分析,其实非常简单,这只是一个普通的类中方法的调用,其实是一个单线程的执行,我们来修改代码进一步验证下:
这段代码分别在主线程和我们的TestThread的方法中打印当前线程名字,运行结果如下:
在TestThread类和主线程中运行的是同一个线程,说明在直接调用run时是不能使用多线程的,那么把上面的run方法调用改为start方法的调动再看一下。
运行结果如下:
很明显,这才是我们想看到的结果,所以结论是只有调用Thread的start方法,将线程交由JVM控制,才能产生多线程,而直接调用run方法只是一个普通的单线程程式。