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

在Java多线程编程中,Thread类是一个非常重要的类,它提供了创建和管理线程的能力。对于初学者来说,理解Thread类的start()方法和run()方法之间的区别尤为重要。本文将深入探讨这两者之间的不同,帮助读者更好地掌握Java多线程编程的基础知识。

引言
在Java中,Thread类是创建新线程的基础。通过继承Thread类并重写其run()方法,或者实现Runnable接口并将其实例作为Thread的构造器参数,我们可以定义线程执行的任务。然而,仅仅定义了任务(即run()方法)并不足以启动线程,还需要通过调用start()方法来实现。(上面绿色背景的内容是可以用来创建线程的几种方法)

 1.start() 方法

1.1功能描述

start()方法是用来启动线程的。当调用线程的start()方法时,Java虚拟机(JVM)会为该线程分配必要的资源,并创建一个新的调用栈。然后,JVM会将该线程的run()方法放到新创建的调用栈中,并由Java虚拟机通过该线程来执行这个run()方法。

1.2 重要特性
异步执行:start()方法会立即返回,而run()方法在新的线程中异步执行。
线程状态:调用start()方法后,线程的状态会从NEW变为RUNNABLE,准备执行。
只能调用一次:每个线程只能调用一次start()方法,再次调用将抛出IllegalThreadStateException.

对于上述所写的每个线程只能调用一次start解释

解释一(接下来的内容小编用大白话为大家解释方便理解):一个Thread的对象对应于一个线程,也就是说如果  实例对象.start()  了两次,就代表一个对象对应于两个线程,同理如果   对象.start()   多次的话就会有对应很多的线程这样的话会使得对象不好管理多个线程。

解释二 

具体的原因可以通过start方法的源码来查看:

由上图我们得知不能重复调用start方法的原因   在于每次调用start函数之前需要判断start的状态是否为新建状态NEW(对应上面判断是为否0),如果不为新建状态NEW 就会抛出异常“IllegalThreadStateException”,当start被调用之后此线程的状态会被调整为就绪状态RUNNABLE,每次在进行调用start方法之前都会检查start函数的状态是什么,如果start的状态为“RUNNABLE”那么便不会开启线程,同时会进行异常(IllegalThreadStateException)的抛出 。

2.run() 方法

2.1 功能描述

run()方法是线程需要执行的任务的入口点。它是Thread类中的一个方法,通常被重写以包含线程的具体工作(又名线程体)。然而,直接调用线程的run()方法并不会启动新线程,而是在当前线程中同步执行run()方法体内的代码。

2.2 调用方式
直接调用:直接调用某个线程的run()方法,实际上是在当前线程中执行该run()方法,并不会启动新线程。
通过start()间接调用:通过调用线程的start()方法,JVM会间接调用该线程的run()方法,但此时run()方法是在新线程中执行的。

3. 两者区别总结

目的不同start()方法用于启动线程,而run()方法定义了线程执行的任务
执行方式不同:start()方法导致run()方法在新线程中异步执行(下面有解释),而直接调用run()方法则是在当前线程中同步执行。
线程状态影响:调用start()方法会改变线程的状态,并启动线程的执行流程;而调用run()方法则不会。
使用限制:start()方法在一个线程的生命周期中只能被调用一次;而run()方法则可以被任意次调用(尽管直接调用通常不符合多线程编程的初衷)

异步执行

异步执行的含义:异步执行意味着一个任务(或操作)可以在不阻塞主线程(或调用线程)的情况下执行。在多线程环境中,当你启动一个线程去执行 run() 方法中的代码时,这个任务就在新的线程中异步执行了,因为主线程(或调用线程)可以继续执行其他任务,而不需要等待这个新线程完成。
异步执行是计算机程序中的一种重要执行方式,它通过将耗时或等待时间长的任务放入任务队列中,并在主线程空闲时处理这些任务,从而提高了程序的执行效率和响应速度。

4. 结论

理解start()方法和run()方法之间的区别对于掌握Java多线程编程至关重要。start()方法是启动新线程的关键,而run()方法则是定义线程具体任务的地方。确保在正确的上下文中使用它们,可以帮助我们编写出高效、可靠的多线程应用程序。

以上就是分享的全部内容,希望对大家有所帮助~

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值