1 问题描述
为了更好的利用cpu资源,一般采用多线程的方式去实现:也就是在一个程序在运行时,不仅仅是只有一个线程在运行。那么该如何真正的实现多线程运行呢?
2 问题分析
首先我们得有两个线程,以下代码是通过继承Thread类的方式创建的两个线程,可以看出两者都是重写了run:
那么问题来了,如果要启动两个线程,达到并发的效果呢?run()or start()?
3 解决方案
第一次尝试使用run方法启动两个线程,控制台内先打印了1000次的“线程1”,然后打印了1000次“线程2”(图1)。
第二次尝试使用start方法启动两个线程,控制台随机打印了“线程1”与“线程2”(图2)。
图1
图2
很明显,start()达到了两个线程运行的效果。
使用run()时,仅当作了一个方法被调用,程序中依旧只有一个线程(主线程)。
使用start()启动线程时,将自动调用run()方法,它不需要等待run()中的代码执行完毕,这是由于jvm的内存机制规定的。注:run()方法必须是public访问权限,返回值为void。
事实上,使用start方法启动线程才是真正实现了多线程运行。
多线程原理:分时利用CPU,宏观上让所有线程一起执行,也叫并发。
4 总结
run(): 只是调用了一个普通方法,并没有启动另一个线程,程序还是会按照顺序执行相应的代码。
start() 则表示,重新开启一个线程,不必等待其他线程运行完,只要得到cup就可以运行该线程。
如果想要实现多线程并行的效果,那么则采用start方法去调用。