Thread start()和run()方法的区别??

本文探讨了Java中线程的start()与run()方法的区别,指出start()用于启动线程并异步执行,而run()则作为线程执行体,直接调用将同步执行。文章还提及了线程的几种基本状态,包括创建态、就绪态、运行态、阻塞态和消亡态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天去面试被问蒙圈了。问线程的start()和run()方法有什么区别,我心想这start()方法听名字是线程的启动方法,run()方法就是实现runnable接口或者实现Thread类时覆写的方法,这会有什么区别吗?有可比性吗?工作了8年,第一次听到这问题,真的蒙了。

本着求真务学的态度,回来查一下,莫非是自己见识短浅,孤陋寡闻了?一查网上还是有很多人来比较两个方法的区别的。就如下面这篇写得挺详细。

http://www.runoob.com/note/33934

不查不知道,一查就被气得吐血。启动线程的就是start()方法异步执行,run()方法就是普通方法调用同步执行。

尼玛,用线程你会用run方法运行吗?这俩方法从功能上讲都不一样,有可比性吗?

好好好,小崽子们会玩儿!!!

写此文提示,如果有哪个面试官或者即将成为面试官的人,提问的时候,建议如下问法:

请您说一说线程的start()方法和run()方法。

别加区别,因为俩方法真的没有可比性。

 

线程几个状态面试的时候,也常被问到。

创建态、就绪态、运行态、阻塞态、消亡态

<think>我们正在讨论Python线程中run()start()方法区别。根据用户的问题,我们需要解释这两个方法的不同之处。 首先,回顾一下threading模块的基本用法。当我们创建一个Thread对象时,我们通常会调用start()方法来启动线程。而run()方法是线程实际执行的方法,但通常我们不直接调用它。 关键点: 1. start()方法会启动一个新的线程,并在新线程中调用run()方法。 2. 直接调用run()方法不会创建新线程,而是在当前线程中执行run()方法的内容,就像普通函数调用一样。 为了说明这一点,我们可以参考用户提供的引用[1]中的代码片段。在该代码中,通过创建Thread对象并调用start()方法,两个线程并发执行。如果改为调用run()方法,则不会创建新线程,而是顺序执行。 我们还可以通过一个简单的例子来展示: ```python import threading import time class MyThread(threading.Thread): def run(self): print("Thread started") time.sleep(1) print("Thread finished") # 创建线程对象 t = MyThread() # 使用start()方法:会启动新线程 print("Using start():") t.start() t.join() # 等待线程结束 # 使用run()方法:不会启动新线程,而是在当前线程执行 print("Using run():") t.run() # 注意:这里没有新线程,所以会顺序执行,并且会等待sleep完成 ``` 输出结果: ``` Using start(): Thread started (等待约1秒) Thread finished Using run(): Thread started (等待约1秒) Thread finished ``` 注意:使用start()时,两条打印语句之间会有1秒的等待,但在这1秒内,主线程可以继续执行其他操作(这里我们调用了join所以主线程等待)。而使用run()时,整个程序会阻塞在run()调用上,直到run()方法返回。 另外,用户提供的引用[2]中也有一个使用Thread的示例,其中使用了start()方法来启动线程。 总结: - start():启动新线程,然后在新线程中自动调用run()方法。这是多线程执行的关键。 - run():只是线程要执行的方法,但直接调用它并不会创建新线程。通常我们重写run()方法来定义线程的行为,但不直接调用它(除非我们不想用多线程)。 因此,区别在于:start()用于启动新线程,而run()是线程执行的主体,但不启动新线程。 相关问题: 1. Python中如何创建线程? 2. 除了继承Thread重写run()方法,还有哪些方式定义线程任务? 3. 如何确保线程安全? 4. Python的GIL(全局解释器锁)对多线程有什么影响? 5. 如何实现线程间的通信?</think>### Python线程中`run()`与`start()`方法区别 在Python的`threading`模块中,`run()``start()`是`Thread`的两个核心方法,它们的核心区别在于**线程执行方式**: 1. **`start()`方法** - 启动新线程:调用操作系统API创建新线程 - 异步执行:在新线程中自动调用`run()`方法 - 非阻塞:调用后立即返回,主线程继续执行 ```python t = Thread(target=task) t.start() # 创建新线程执行任务 ``` 2. **`run()`方法** - 直接执行:在当前线程同步执行任务代码 - 阻塞调用:任务完成前不会返回 - 无新线程:不会触发操作系统级的线程创建 ```python t = Thread(target=task) t.run() # 在当前主线程执行任务(非多线程) ``` #### 关键差异对比表 | 特性 | `start()` | `run()` | |--------------|-------------------------|-------------------------| | **线程创建** | 创建新OS级线程 | 无新线程 | | **执行方式** | 异步并发 | 同步阻塞 | | **调用关系** | 自动调用`run()` | 直接执行任务代码 | | **性能影响** | 有线程切换开销 | 无额外开销 | | **典型用途** | 实现并发 | 调试/单线程执行测试 | #### 示例说明 参考用户提供的并发线程示例[^1]: ```python # 正确并发方式 (使用start()) for tid in range(2): t = Thread(target=my_counter) t.start() # 创建两个并发线程 # 错误用法 (实际是单线程) t = Thread(target=my_counter) t.run() # 主线程阻塞执行,无并发效果 ``` #### 何时使用? - 需要并发时 → 用`start()` - 测试任务逻辑 → 用`run()` - 自定义线程 → 重写`run()`方法(但仍通过`start()`触发) > 关键原理:`start()`通过调用底层`_start_new_thread()`创建系统线程[^4],而`run()`只是普通方法调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值