Thread的run方法和start方法的区别
1
线程的概念:线程的起动并不是简单的调用了RUN方法,而是由一个线程调度器来分别调用所有线程的RUN方法,
我们普通的RUN方法如果没有执行完是不会返回的,也就是会一直执行下去,这样RUN方法下面的方法就不可能会执行了,可是线程里的RUN方法却不一样,
它只有一定的CPU时间,执行过后就给别的线程了,这样反复的把CPU的时间切来切去,因为切换的速度很快,所以我们就感觉是很多线程在同时运行一样.
简单的调用run方法是没有这样效果的,所以必须调用Thread类的start方法来启动线程.所以启动线程有两种方法
一是写一个类继承自Thread类,然后重写里面的run方法,用start方法启动线程
二是写一个类实现Runnable接口,实现里面的run方法,用new Thread(Runnable
target).start()方法来启动
这两种方法都必须实现RUN方法,这样线程起动的时候,线程管理器好去调用RUN方法.
2
“老师给我们讲课的时候举过一个例子,就相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等轮到你了,就run()了,当cpu的运行的时间片要到的时候,这个线程就继续排队,等待下一次的run()”
“准确来说,不应该是排队,而应该是老师(JVM)看中谁
另外还有一个状态,就是
你玩的时候你老妈来叫你吃饭了,于是这个时候你就只好离开,老师继续找其他人来玩~那么你这个时候的状态叫做阻塞状态。
当你吃饭玩了后又回来继续玩,这个时候你就又得重新让老师看中你。。。”
3
之所以出现线程,就是为了更好的利用CPU,让她更加“精明”的干活。
通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体, 它包含了要执行的这个线程的内容,
Run方法运行结束, 此线程终止, 而CPU再运行其它线程,
而如果直接用Run方法,
这只是调用一个方法而已,
程序中依然只有主线程--这一个线程,
其程序执行路径还是只有一条,
这样就没有达到写线程的目的。
记住:线程就是为了更好地利用CPU,
提高程序运行速率的!
class OneThread extends Thread {
public void run(){
}
}
public class MainApp {
public static void main(String[] args){
OneThread ot = new OneThread();
//ot.run(); //就相当于调用一个ot中的方法,不会创建新的线程
ot.start();//创建新的线程,并且调用run方法
}
}