Thread中的start方法和run方法
- start()
- run()
- 示例
- start()方法源码
- run()方法源码
start()和run()比较
start()
- 作用: 启动一个新的线程
- 新线程会执行相应的run() 方法
- 同一个线程不能重复调用start() 方法
run()
- run() 方法就和普通的成员方法一样,可以重复进行调用
- 调用run() 方法,会在当前线程中执行run() 方法,并不会启动新的线程
示例
class Threads extends Thread {
public Threads(String threadName) {
super(name);
}
public void run() {
System.out.println(Thread.currentThread().getName() + "正在运行...");
}
};
public class ThreadTest {
public void main(String[] args) {
Thread thread = new Threads("currentThread");
System.out.println(Thread.currentThread().getName() + "正在调用start()方法...");
thread.start();
System.out.println(Thread.currentThread().getName() + "正在调用run()方法...");
thread.run();
}
}
- Thread.currentThread().getName(): 用于获取当前线程的名称. 当前线程是指正在CPU中调度的线程
- thread.run(): 是在主线程main() 中调用的,该run() 方法直接运行在主线程main上
- thread.start(): 会启动线程thread. 线程thread启动之后,会调用启动的线程的run() 方法.此时run() 方法是运行在线程thread之上的
Thread中的源码
start()方法源码
/**
* 执行当前线程,调用线程的run()方法
* 结果包含两个线程,一个调用start()方法的线程和一个调用start()方法返回的线程
* 不允许一个线程重复调用start()方法
*
* @exception IllegalThreadStateException 如果线程已经启动则抛出异常
*/
public synchronized void start() {
/*
* main方法以及JVM中System类的方法不会调用此方法
*/
// 0 - 新建状态new
if (threadStatus != 0)
throw new IllegalThreadStateException();
// 通知线程组将要启动该线程,这样该线程可以加入到线程组启动的线程中,并且线程的中未启动的线程数组减1
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
// 不做操作, 如果start0抛出调用异常,将会被传递给调用堆栈
}
}
}
- start() 方法实际上是通过native方法start0() 启动线程的
- start0() 会新运行一个线程,新线程会调用run() 方法
run()方法源码
/**
* 如果该线程是使用单独线程构造的 Runnable 运行对象,则调用构造的 Runnable 对象中的 run() 方法
* 否则,这个方法将直接返回
*
* 相关的子类线程应该重写该 run() 方法
*/
@Override
public void run() {
if (target != null) {
target.run();
}
}
- target是一个Runnable对象
- run() 方法就是直接Thread线程的Runnable成员的run() 方法,并不会新建一个线程