Java中线程启动:start()与run()方法的区别
- 1. `start()`方法
- 2. `run()`方法
- 3、总结
- 4、示例对比
💖The Begin💖点点关注,收藏不迷路💖 |
线程是并发执行的基本单位,而Thread
类则是实现多线程编程的核心。在使用Thread
类或其子类创建线程时,start()
和run()
是两个至关重要的方法,但它们的作用和调用方式却大相径庭。
1. start()
方法
作用:start()
方法用于启动线程,使线程从新建状态(NEW)进入就绪状态(RUNNABLE),等待JVM的调度执行。一旦线程被启动,它将执行其run()
方法中的代码。
关键特性:
- 调用
start()
后,线程的执行由JVM调度,具体何时执行、执行顺序均不确定。 - 每个线程只能被启动一次,多次调用
start()
会抛出IllegalThreadStateException
。 start()
是异步的,即调用后立即返回,线程在后台执行。
2. run()
方法
作用:run()
方法是线程的主体,包含了线程需要执行的代码。但直接调用run()
方法并不会启动新线程,而是像调用普通方法一样在当前线程中同步执行run()
方法体内的代码。
关键特性:
run()
方法可以被直接调用,但这样做并不会创建新的线程,而是直接在调用它的线程中执行。- 如果想要在新线程中执行
run()
方法中的代码,必须通过start()
方法启动线程。 run()
方法的执行是同步的,即调用后等待其执行完成才继续执行后续代码(但这仅针对直接调用run()
的情况,通过start()
启动线程则不会阻塞)。
3、总结
1、简而言之,start()
方法用于启动线程,让线程进入就绪状态等待JVM调度执行其run()
方法中的代码;
2、而直接调用run()
方法则是在当前线程中同步执行run()
方法体内的代码,不会创建新线程。
4、示例对比
// 1、使用start()方法启动线程
Thread thread = new Thread(() -> { System.out.println("线程运行中...");
});
thread.start(); // 正确启动线程 // 2、直接调用run()方法
Thread thread2 = new Thread(() -> { System.out.println("这不是新线程,是直接在主线程中执行");
});
thread2.run(); // 直接在当前线程(主线程)中执行run()方法
在上面的示例中,thread.start()会启动一个新线程来执行打印操作,而thread2.run()则直接在主线程中执行打印操作,不会创建新线程。
💖The End💖点点关注,收藏不迷路💖 |