0
点赞
收藏
分享

微信扫一扫

Java多线程Day03-多线程之Thread的start()和run()



Thread中的start方法和run方法


  • ​​start()和run()比较​​

  • ​​start()​​
  • ​​run()​​
  • ​​示例​​

  • ​​Thread中的源码​​

  • ​​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() 方法
/**
* 执行当前线程,调用线程的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()方法源码

  • Thread中的run() 方法源码:
/**
* 如果该线程是使用单独线程构造的 Runnable 运行对象,则调用构造的 Runnable 对象中的 run() 方法
* 否则,这个方法将直接返回
*
* 相关的子类线程应该重写该 run() 方法
*/
@Override
public void run() {
if (target != null) {
target.run();
}
}

  • target是一个Runnable对象
  • run() 方法就是直接Thread线程的Runnable成员的run() 方法,并不会新建一个线程


举报

相关推荐

0 条评论