Thread线程的run和start区别

 Thread的start和run

1) start:

用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

2) run:

run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

举例说明一下:

记住:线程就是为了更好地利用CPU,
提高程序运行速率的!

public class TestThread1{
public static void main(String[] args){
Runner1 r=new Runner1();
//r.run();//这是方法调用,而不是开启一个线程
Thread t=new Thread(r);//调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。
t.start();

for(int i=0;i<100;i++){
System.out.println("进入Main Thread运行状态");
System.out.println(i);
}
}
}
class Runner1 implements Runnable{ //实现了这个接口,jdk就知道这个类是一个线程
public void run(){

for(int i=0;i<100;i++){
System.out.println("进入Runner1运行状态");
System.out.println(i);
}
}
}

同时摘取一段外文网站论坛上的解释:
Why do we need start() method in Thread class? In Java API description for Thread class is written : "Java Virtual Machine calls the run method of this thread..".

Couldn't we call method run() ourselves, without doing double call: first we call start() method which calls run() method? What is a meaning to do things such complicate?

 

 

There is some very small but important difference between using start() and run() methods. Look at two examples below:

Example one:

Code:

Thread one = new Thread();
Thread two = new Thread();
one.run();
two.run();

Example two:

Code:

Thread one = new Thread();
Thread two = new Thread();
one.start();
two.start();

The result of running examples will be different.

In Example one the threads will run sequentially: first, thread number one runs, when it exits the thread number two starts.

In Example two both threads start and run simultaneously.

Conclusion: the start() method call run() method asynchronously (does not wait for any result, just fire up an action), while we run run() method synchronously - we wait when it quits and only then we can run the next line of our code.

 

http://blog.youkuaiyun.com/tornado886/archive/2009/09/06/4524346.aspx

 

 

Thread对象的run()方法在一种循环下,使线程一直运行,直到不满足条件为止,在你的main()里创建并运行了一些线程,调用Thread类的start()方法将为线程执行特殊的初始化的过程,来配置线程,然后由线程执行机制调用run()。如果你不调用start()线程就不会启动。

 

 

因为线程调度机制的行为是不确定的,所以每次运行该程序都会有不同的结果,你可以把你的循环次数增多些,然后看看执行的结果,你会发现main()的线程和Thread1是交替运行的。
4.还有就是尽管线程的调度顺序是不固定的,但是如果有很多线程被阻塞等待运行,调度程序将会让优先级高的线程先执行,而优先级低的线程执行的频率会低一些。

 

 

线程的启动是比较复杂的,需要为线程分配资源,它的START方法被调用时系统才会为线程分配资源。
你上面调用线程的run方法只能算普通的方法调用一样,得运行完run里面的代码整个程序才能往下进行,而如果调用start方法,线程和MAIN方法就会抢资源,打印的语句会交替出现,你把线程里的循环次数加到300,试一下依次调run、start和两次都调start方法时所出现的情况应该能看出点端倪~~~

<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、付费专栏及课程。

余额充值