文章目录
- 前言
- 回顾
- `run()` 方法 vs `start()` 方法
- `run()`方法
- `start()`方法
- 直接调用 `run()` 方法的影响
- 直接调用 `run()` 方法
- 调用 `start()` 方法
- 示例解析
- 结论
- 个人简介
前言
- 在Java中,多线程编程是一个重要的概念,尤其是在处理并发任务时。线程是Java中实现多线程的一种方式。在使用线程时,理解
run()
方法和start()
方法之间的区别是至关重要的。本文将深入探讨如果直接调用线程的run()
方法会发生什么。 - 先说结论:
直接调用 run() 方法不会启动一个新的线程,它只是普通方法调用,代码在当前线程中同步顺序执行。
回顾
- Java 提供了继承
Thread
类、实现Runnable
接口两种方式来实现线程,无论使用哪种方式,都需要重写run()
方法,这是线程执行的入口点。启动一个线程通常使用Thread
对象的start()
方法,该方法会触发线程的启动,并最终调 用run()
方法。
run()
方法 vs start()
方法
run()
方法
run()
方法包含了线程要执行的代码。- 直接调用
run()
方法不会启动一个新线程,它只是在当前线程中执行run()
方法体中的代码。 - 换句话说,直接调用
run()
方法相当于调用一个普通的方法,没有并发行为。
start()
方法
start()
方法会创建一个新的线程,并在新的线程中执行run()
方法。- 调用
start()
方法会使线程从“新建”状态变为“就绪”状态,等待CPU调度。
直接调用 run()
方法的影响
- 为了更好地理解直接调用
run()
方法的影响,考虑以下示例代码:
class MyThread extends Thread {public void run() {System.out.println("Thread is running");}
}public class Main {public static void main(String[] args) {MyThread thread = new MyThread();// 直接调用run()方法thread.run();// 调用start()方法thread.start();}
}
- 在上述代码中,
thread.run()
和thread.start()
的行为是完全不同的。
直接调用 run()
方法
- 当thread.run()被调用时,输出“Thread is running”。这段代码在主线程中执行,没有启动新的线程。此时,主线程和线程对象的run()方法体是同步顺序执行的。
调用 start()
方法
- 当thread.start()被调用时,输出“Thread is running”。这段代码在一个新线程中执行,与主线程并发运行。主线程和新启动的线程是同时执行的,体现了多线程的并发特性。
示例解析
- 通过以下代码示例可以更清晰地看出区别:
class MyRunnable implements Runnable {public void run() {for (int i = 0; i < 5; i++) {System.out.println("Runnable running " + i);}}
}public class Main {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);// 直接调用run()方法myRunnable.run();// 调用start()方法thread.start();}
}// 输出
Runnable running 0
Runnable running 1
Runnable running 2
Runnable running 3
Runnable running 4
Runnable running 0
Runnable running 1
Runnable running 2
Runnable running 3
Runnable running 4
- 前五行输出是
myRunnable.run()
直接调用产生的,后五行是thread.start()
启动的新线程产生的。
结论
- 直接调用
run()
方法不会启动一个新的线程,它只是普通方法调用,代码在当前线程中同步顺序执行。而调用start()
方法则会启动一个新的线程,并在该线程中执行run()
方法的代码。
个人简介
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。
🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。
💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。
🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。
📖 保持关注我的博客,让我们共同追求技术卓越。