Java多线程Day03-多线程之Thread的start()和run()
原创
©著作权归作者所有:来自51CTO博客作者攻城狮Chova的原创作品,请联系作者获取转载授权,否则将追究法律责任
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()方法源码
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() 方法实际上是通过native方法start0() 启动线程的
-
start0() 会新运行一个线程,新线程会调用run() 方法
run()方法源码
@Override
public void run() {
if (target != null) {
target.run();
}
}
-
target是一个Runnable对象
-
run() 方法就是直接Thread线程的Runnable成员的run() 方法,并不会新建一个线程