run()和start()的区别

在学习run()和start()方法之前,你需要了解Runnable接口和Tread对象的区别和作用是什么。可以参考我的博文Runnable和Thread的区别。
还是简单介绍一下Runnable接口和Thread对象吧。
实现了Runnable接口的对象并不是线程,它只是任务。Thread对象才是真正的线程创建者。也就是说,任务和线程是分开的,任务放在线程里面才会被执行。
简单的事例:

public class ThreadDemo {

    public static void main(String[] args) {
            RunnableThread runnableThread = new RunnableThread();
            runnableThread.run();
            runnableThread.run();
            runnableThread.run();
            runnableThread.run();
    }
}
public class RunnableThread implements Runnable{

    private int count = 10;
    @Override
    public void run() {
        while(count>0){
            System.out.println(Thread.currentThread().getName() + "-------" + count--);
        }
    }

结果:

main——-10
main——-9
main——-8
main——-7
main——-6
main——-5
main——-4
main——-3
main——-2
main——-1

这里就有一个主线程main,这也印证了我上面提到的——实现了Runnable接口的对象只是任务,它定义了线程所要执行的任务,是任务的定义者,并不是线程。而在此任务中,run()方法才是任务的实际运行者,main只有调用run()方法才能执行任务。
来说说start()方法:

    public static void main(String[] args) {
        RunnableThread runnableThread = new RunnableThread();
        //new Thread(Runnable target)创建一个新的Thread对象
        new Thread(runnableThread).start();
        new Thread(runnableThread).start();
        new Thread(runnableThread).start();
        new Thread(runnableThread).start();
    }

结果:

Thread-1——-10
Thread-1——-8
Thread-1——-7
Thread-2——-9
Thread-2——-6
Thread-2——-4
Thread-1——-5
Thread-1——-1
Thread-2——-3
Thread-0——-2

这里显示了3个线程Thread-0、Thread-1和Thread-2,Thread-3由于CPU运行速度太快没有显示出来。我们通过将Runnable接口的实例传入Thread对象中,来创建线程。所以我们得出Thread对象才是真正的线程创建者。而由Runnable接口实例创建的线程会处理同一资源。start()方法将线程启动并初始化,使线程处于就绪状态。当CPU调度此线程时,就会进入运行状态,执行run()方法。
由此总结出2句话:
start()是线程的启动者。
run()是线程任务的运行者。

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
线程run()方法和start()方法有以下区别:\[1\]\[2\]\[3\] - run()方法只是类的一个普通方法,如果直接调用run()方法,程序中只有主线程这一个线程,程序执行路径还是只有一条,需要等待run()方法执行完毕后才能继续执行下面的代码。 - start()方法是调用线程类的方法,通过调用start()方法才能真正实现多线程的目的。调用start()方法会启动一个新的线程,并使线程进入就绪状态,当分配到时间片后就可以开始运行了。start()方法会执行线程的准备工作,然后自动执行run()方法的内容,这是真正的多线程工作。 总结起来,直接调用run()方法只是在当前线程中执行run()方法的内容,而调用start()方法会启动一个新的线程,并在新的线程中执行run()方法的内容,实现了多线程的并发执行。 #### 引用[.reference_title] - *1* *2* [线程中start方法和run方法的区别](https://blog.csdn.net/qq_40649503/article/details/124556991)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [线程start() 和 run()的区别](https://blog.csdn.net/weixin_38568503/article/details/123357311)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值