首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

thread 类中的start() 和 run() 方法有什么区别?

在Java的Thread类中,start()方法和run()方法都与线程的执行有关,但它们的作用和使用方式有很大的区别。

start() 方法

基础概念:

  • start()方法是用来启动一个新线程,使得该线程开始执行。
  • 当调用start()方法时,Java虚拟机(JVM)会自动调用该线程的run()方法。

优势:

  • 允许程序在多线程环境下并发执行,提高程序的执行效率。
  • 线程的创建和启动是分离的,便于管理和控制。

应用场景:

  • 当你需要同时执行多个任务,且这些任务之间相互独立时。
  • 在需要进行异步处理或并发操作的场景中。

示例代码:

代码语言:txt
复制
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("线程正在运行...");
    }
});
thread.start(); // 启动新线程

run() 方法

基础概念:

  • run()方法是线程的主体,包含了线程需要执行的代码。
  • 直接调用run()方法并不会启动新线程,而是在当前线程中执行run()方法的代码。

类型:

  • run()方法可以是publicprotected,具体取决于继承的Thread类的实现。

应用场景:

  • 当你需要在线程内部执行特定的任务,而不需要启动新线程时。
  • 在某些情况下,可以通过重写run()方法来自定义线程的行为。

示例代码:

代码语言:txt
复制
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("线程正在运行...");
    }
});
thread.run(); // 在当前线程中执行run()方法

区别总结

  1. 启动新线程:
    • start():启动新线程,并在新线程中调用run()方法。
    • run():在当前线程中直接执行,不会启动新线程。
  • 执行方式:
    • start():通过JVM调度,在新线程中异步执行。
    • run():同步执行,阻塞当前线程直到run()方法执行完毕。
  • 使用场景:
    • start():适用于需要并发执行任务的场景。
    • run():适用于不需要启动新线程,仅在当前线程中执行任务的场景。

可能遇到的问题及解决方法

问题:

  • 直接调用run()方法而不是start()方法,导致任务没有在新线程中执行。

原因:

  • start()run()方法的区别理解不清,误以为调用run()方法会启动新线程。

解决方法:

  • 确保在需要启动新线程时使用start()方法,而不是run()方法。
  • 如果需要在线程内部执行特定任务,可以直接调用run()方法,但要注意这不会启动新线程。

通过理解这两个方法的区别和使用场景,可以更好地管理和控制多线程程序的执行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

面试题:Thread的start和run的区别

t.run(); //调用run方法 //调用执行 current main thread is main task run..... task thread is : main 换成调用方法t.start...(),执行 current main thread is main task run..... task thread is : Thread-0 小伙伴们是否已经知道他们的区别了 1、run方法就是个普通的方法...2、start方法被main线程调用,但执行task()方法并不是main线程。 源码分析 知道了run和start的区别,我们来看看start方法源码 ?...start0映射的方法就是JVM_StartThread,我们再看一下jvm.cpp文件中JVM_StartThread方法,里面有段代码 ? 在看下thread_entry方法 ?...就是在thread_entry方法中调用run方法 总结 start方法中的基本流程 ? 小伙伴们看到这里,是不是感觉这个面试题很简单呢?

93010

Java的Thread 类中 yield 方法有什么作用?

Java中的Thread类是实现多线程编程的关键基础。在Java中,yield()方法是其中一个用于控制线性“执行/被执行”的指令之一。...yield 方法的基本语法 yield()方法是Thread类中的一个静态方法,可以直接通过Thread.yield()方式调用,其基本语法如下: java复制代码 public static void...那么在实际开发中,yield() 方法有什么用处呢?以下是一些经典的场景: 1. 增加程序的并发性 默认情况下,Java中的多线程会采用抢占式调度机制,即内核可能会按照其自身的策略随时切换到其他线程。...防止编写非标准的代码 当程序员为Thread类创建一个不遵循基本的线程互操作惯例的类时,您还需要使用yield()方法来增强代码的可移植性。...因此,与特定硬件的兼容性问题还应加以考虑。 总体而言,yield()方法虽然有其合理的应用场景,但是使用频率不大。

51420
  • PHP的抽象类和接口类有什么区别

    抽象类(abstract class)和接口(interface)是 PHP 中实现面向对象编程的两种重要工具,它们之间有许多相似之处,但也有很多关键区别。以下是它们的主要区别:1. ...继承:一个类只能继承一个抽象类。方法:抽象类可以包含具体的方法(有实现的方法)和抽象的方法(没有实现的方法)。...构造函数抽象类(abstract class)抽象类可以有构造函数,构造函数可以在父类中实现,并且可以被子类继承和调用。...抽象类适合用来描述一些具有共性的类,并将通用行为和属性提取到基类中。当类之间有层次关系(如父子类关系)时,抽象类是一个不错的选择。...总结表格特性抽象类(abstract class)接口(interface)方法实现可以有部分实现(有实现的方法和抽象方法)只有方法声明,没有实现,类必须实现所有方法属性可以有属性(成员变量)不能有属性

    1000

    Java并发编程——Thread类中interrupt()、interrupted()和isInterrupted()方法详解

    下面我们进行测试说明: 定义一个MyThread类,继承Thread,如下: public class MyThread extends Thread { @Override public...Thread.currentThread()函数可以获取当前线程,下面代码中获取的是main线程 public class Do { public static void main(String[]...方法有检测中断并清除中断状态的作用,预料中的输出应该是true-true-false,实际输出如下: 结果证明猜想是正确的。...若果想要是实现调用interrupt()方法真正的终止线程,则可以在线程的run方法中做处理即可,比如直接跳出run()方法使线程结束,视具体情况而定,下面是一个例子。...还有一点就是interrupted()作用于当前线程,interrupt()和isInterrupted()作用于此线程,即代码中调用此方法的实例所代表的线程。

    65230

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

    1、线程的start()方法   start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码: 通过调用Thread类的start()方法来启动一个线程...然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程。...,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码: 而如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程–这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的...Thread-1---1 Thread-1---2 Thread-1---3 总结   调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。...这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。

    30330

    「附数据结构资源」玩转java并发(六):深入线程Thread类的start()方法和run()方法

    每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。...线程不是马上执行的;准确来说,调用start( )方法后,线程的状态是“READY(就绪)”状态,而不是“RUNNING(运行中)”状态(关于线程的状态详细。...三、run( )方法 1、run方法又是一个什么样的方法?run方法与start方法有什么关联?...总结: 通过实例1和实例和我们可以知道start方法是用于启动线程的,可以实现并发,而run方法只是一个普通方法,是不能实现并发的,只是在并发执行的时候会调用。...= null) { 3 target.run(); 4 } 5} 五、真正理解Thread类 Thread类的对象其实也是一个java对象,只不过每一个Thread类的对象对应着一个线程

    39020

    thread类中start()和run()方法的区别

    run方法体代码执行完毕而直接继续执行下面的代码: 通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。...然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程。...2,run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码: 而如果直接用run方法,这只是调用一个方法而已,程序中依然只有主线程–这一个线程,...3,调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。...这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。

    4.1K00

    多线程 start 和 run 方法到底有什么区别?

    线程分组的妙用。今天,栈长会详细介绍 Java 中的多线程 start() 和 run() 两个方法,Java 老司机请跳过,新手或者对这两个不是很理解的可以继续往下看。...首先要知道实现多线程最基本的两种方式: 1、继承 java.lang.Thread 类; 2、实现 java.lang.Runnable接口; 其中 Thread 类也是实现了 Runnable 接口,...而 Runnable 接口定义了唯一的一个 run() 方法,所以基于 Thread 和 Runnable 创建多线程都需要实现 run() 方法,是多线程真正运行的主方法。...类的方法,用来异步启动一个线程,然后主线程立刻返回。...看完这篇,你应该对 start 和 run 方法有了一个大概的掌握吧,再也不怕面试官问你这两个的区别了吧!

    1.4K10

    深入线程Thread类的start()方法和run()方法

    每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。...线程不是马上执行的;准确来说,调用start( )方法后,线程的状态是“READY(就绪)”状态,而不是“RUNNING(运行中)”状态(关于线程的状态详细。...三、run( )方法 1、run方法又是一个什么样的方法?run方法与start方法有什么关联?...总结: 通过实例1和实例和我们可以知道start方法是用于启动线程的,可以实现并发,而run方法只是一个普通方法,是不能实现并发的,只是在并发执行的时候会调用。...= null) { target.run(); } } 五、真正理解Thread类 Thread类的对象其实也是一个java对象,只不过每一个Thread类的对象对应着一个线程

    3K00

    Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别?

    sleep()方法(休眠)是线程类(Thread)的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁依然保持,因此休眠时间结束后会自动恢复(线程回到就绪状态...,请参考第66题中的线程状态转换图)。...wait()是Object类的方法,调用对象的wait()方法导致当前线程放弃对象的锁(线程暂停执行),进入对象的等待池(wait pool),只有调用对象的notify()方法(或notifyAll(...)方法)时才能唤醒等待池中的线程进入等锁池(lock pool),如果线程重新获得对象的锁就可以进入就绪状态。

    1.1K50

    《Java扫盲系列》第1章:Thread类的stop()方法和interrupt()方法到底有何区别?

    我细想了下,也许有那么点大环境的原因吧,但无论面试的套路怎么变,只要掌握了核心知识和底层原理,找一份比较好的工作应该不难吧。...玩笑归玩笑,学习知识并不只是为了应付面试,更应该将这些知识运用到实际的工作中。...朋友面试挂了 一个工作了几年的朋友今天打电话和我聊天,说前段时间出去面试,面试官问他做过的项目,他讲起业务来那是头头是道,犹如滔滔江水连绵不绝,可面试官最后问了一个问题:Thread类的stop()方法和...interrupt方法有啥区别。...事后,我也是感慨颇多,哎,不多说了,今天就简单的说说Thread类的stop()方法和interrupt()方法到底有啥区别吧。

    20320

    【Groovy】Groovy 扩展方法 ( Groovy 扩展方法引入 | 分析 Groovy 中 Thread 类的 start 扩展方法 )

    文章目录 一、Groovy 扩展方法引入 二、 分析 Groovy 中 Thread 类的 start 扩展方法 一、Groovy 扩展方法引入 ---- Groovy 可以对 JDK 中的一些类进行...| 运行服务器端与客户端效果及过程分析 ) 中 , 使用了 Thread.start { } 用法 , 在闭包中执行的就是线程 Thread 的 run 方法内容 ; 二、 分析 Groovy 中 Thread...类的 start 扩展方法 ---- 分析该为 Thread 类扩展的 start 扩展方法 , 扩展方法定义在了 DefaultGroovyStaticMethods 类中 ; 该 start 方法接收一个...start 扩展方法 , 其它非 Thread 类型的对象 , 无法调用该 start 方法 ; 指定扩展方法的参数 : 第二个参数 Closure closure , 表示为 Thread 类扩展的...start 方法参数是 闭包 类型 ; Thread 类的 start 扩展方法 源码 : /** * 这个类定义了groovy环境中普通JDK类上出现的所有新的静态groovy方法。

    1.5K30

    线程池的execute方法和submit方法有什么区别?

    我们再来看submit方法。区别就是submit方法,会返回一个Future对象。显然它是比execute方法多了一些内容的。...(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 但它也仅仅是输出而已,我们无法使用logback之类的日志框架对其进行记录...解决方法 首先看下submit 方式的解决方法。通过返回的Future,执行它的get方法,即可获取完成的错误堆栈。...(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) 但我们平常情况下,使用Future的时候并不多,因为它会阻塞我们的请求...作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。

    2K20

    java中接口和抽象类有什么区别,举例!

    2)接口和抽象类有什么区别? 答:马克-to-win:抽象类里可以有实现的方法,接口里不能有,所以相对来讲各方面实现都简单(尤其动态方法调度)。另外:类可以实现多个接口。...(见下面我的山和车,肥皂的例子)【新手可忽略不影响继续学习】 答:假设你用抽象类作为合同,外部系统有个类A,它本来固有就必须得继承一个类B,现在还必须得继承你这个抽象类,语法上不允许。...4)为什么接口中的属性和方法都默认为public?Sun公司当初为什么要把java的接口设计发明成这样? ...“外部”二字自然让我们做出如下结论:属性和方法都应默认为public。...因为是和外部系统打交道,存在很大的未知性,我并不知道未来外部别人怎么用我们的接口,所以尽量少给别人设置障碍(少添点堵),就设置权限为public,出于这种考虑,Sun公司一开始就规定,接口属性和方法默认就为

    47740

    Thinkphp的公共函数和类有什么区别?

    比如我要写一个用户验证(CheckUser),我可以写在Common的function.php中,也可以写在Model里的CheckUserModel.class.php里。他们有什么区别?...function.php里面是放一些功能函数, 一般我们会在随便什么地方就使用 xyz($param) 这样的方式调用; 而Model中, 则是与我们的事务处理有关的, 一般来说和我们处理的对象或者流程紧密相关..., 而且Class中定义的函数和变量自身也高端相关, 针对性更强....就你说的用户验证为例, checkUser函数不是简单一个功能, 他需要读取数据库(调用Model), 可能还有一些我们一般都会用到的相关的函数(比如getUser, getUserGroup等), 各函数还会有公用的变量和一些定义...函数和方法的区别 函数,你可以当做一个算法的实现。函数是单独存在的,也就是面向过程部分定义的。 方法,则可以当做一个业务逻辑的实现。方法是依赖于类存在的,也就是面向对象中定义的。

    1K30

    MyBatis配置中的#{}和${}有什么区别?

    前几天,一位应届生去面试,被问到一个MyBatis中比较基础的问题,说MyBatis中的#号和$符号有什么区别?今天,我给大家来详细介绍一下。...它相当于向PreparedStatement预处理语句中设置参数,而PreparedStatement中的SQL语句是预编译的,如果在设置的参数包含特殊字符,会自动进行转义。...,前者是动态参数,后者是占位符, 动态参数无法防止SQL注入的问题,所以在实际应用中,应该尽可能的使用#号占位符。...另外,$符号的动态传参,可以适合应用在一些动态SQL场景中,比如动态传递表名、动态设置排序字段等。 2、总结 一些小的细节如果不注意,就有可能造成巨大的经济损失。...在技术如此成熟的互联网时代,还是会有一些网站经常出现SQL注入导致信息泄露的问题。 以上就是我对MyBatis配置#号和$号的理解。

    2.8K20
    领券