经常看源码的大家应该都知道,Thread中包含了start和run两个方法,这两个方法都是用来启动线程的,那么他们到底有什么区别,我们来讲一讲…
是什么??
start()方法是什么? 线程类的start方法可以用来启动线程,该方法会在内部调用Runnable接口的run方法,以在单独的线程中执行run方法中所指定的代码 启动线程执行的任务:
统计一个新线程线程从New state移动到Runnable状态当线程有机会执行时,他的目标run方法将运行 run()方法是什么??
线程类的run方法是Runnable接口的一个抽象方法,由虚拟机直接调用,不会创建新的线程
区别?!
start方法的作用是启动一个新线程,新线程会执行相应的run方法,start方法不能被重复调用 run方法就和普通的成员方法一样,可以被重复调用。单独调用run方法的话,会在当前线程中执行run,而不会去启动新的线程。
Public
class MyThread extends Thread{
public void run(){
....
}
};
MyThread aaa
=new MyThread();
当aaa执行start方法时,会创建一个新的线程,并在新的线程中使用run方法;而当aaa执行run方法的时候,则直接在当前线程中运行run方法,而不会启动一个新线程来运行run方法
样例
class MyThread extends Thread{
public MyThread(String name
){
super(name
);
}
public void run(){
System
.out
.println(Thread
.currentThread().getName
+"is running");
}
};
public class demo{
public static void main(String
[] args
){
Thread myThread
=new MyThread("myThread");
System
.out
.println(Thread
.currentThread
.getName()+" call myThread.run()");
myThread
.run();
System
.out
.println(Thread
.currentThread
.getName()+" call myThread.start()");
myThread
.start();
}
}
执行结果:
main call myThread.run
()
main is running
;
main myThread.start
();
myThread is running
说明: (01) Thread.currentThread().getName()是用于获取“当前线程”的名字。当前线程是指正在cpu中调度执行的线程。 (02) mythread.run()是在“主线程main”中调用的,该run()方法直接运行在“主线程main”上。 (03) mythread.start()会启动“线程mythread”,“线程mythread”启动之后,会调用run()方法;此时的run()方法是运行在“线程mythread”上。
相关源码(jdk 8)
public synchronized void start() {
if (threadStatus
!= 0)
throw new IllegalThreadStateException();
group
.add(this);
boolean started
= false;
try {
start0();
started
= true;
} finally {
try {
if (!started
) {
group
.threadStartFailed(this);
}
} catch (Throwable ignore
) {
}
}
}
start()实际上是通过本地方法start0()启动线程的。而start0()会新运行一个线程,新线程会调用run()方法。
private native void start0();
public void run() {
if (target
!= null
) {
target
.run();
}
}
target是一个Runnable对象。run()直接调用Thread线程的Runnable成员的run()方法,不会新建线程。