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

使用Runnable和派生Thread类的线程之间的行为意外差异

使用Runnable和派生Thread类的线程之间的行为意外差异主要在于它们的实现方式和继承方式。

  1. 定义和实现

Runnable是一个接口,它包含一个方法run(),用于定义线程的任务。而Thread类是一个抽象类,它也包含一个方法run(),用于定义线程的任务。当使用Runnable接口时,需要创建一个实现Runnable接口的匿名内部类,并在其中实现run()方法。而派生Thread类时,需要创建一个继承Thread类的子类,并在其中重写run()方法。

  1. 多继承问题

Java不支持多继承,因此当使用派生Thread类的方式创建线程时,该线程类只能继承一个父类。而使用Runnable接口的方式可以避免这个问题,因为它是一个接口,可以同时实现多个接口。

  1. 代码风格和可读性

使用Runnable接口的方式更加灵活,因为它可以将线程的任务和其他功能分离,使代码更加模块化。而派生Thread类的方式将线程的任务和线程的控制放在同一个类中,这可能会导致代码难以阅读和维护。

  1. 应用场景

在选择使用Runnable和派生Thread类的方式时,需要根据具体的应用场景来决定。如果需要创建一个继承自其他类的线程,或者需要同时实现多个接口,则使用Runnable接口的方式更加合适。如果需要创建一个具有特定功能的线程,并且不需要继承其他类,则派生Thread类的方式更加合适。

总之,使用Runnable和派生Thread类的线程之间的行为意外差异主要在于它们的实现方式和继承方式。在选择使用哪种方式时,需要根据具体的应用场景和需求来决定。

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

相关·内容

多线程 | Thread 和 Runnable 执行流程的差异

无论是使用 继承 Thread 类 的方式,还是 实现 Runnable 接口 的方式,本质上是没有差别的。因为 Thread 本身也是实现了 Runnable 接口的。...查看 Thread 类的定义,定义如下: class Thread implements Runnable 如果使用继承 Thread 类的方式,通常,我们会定义一个 MyThread...这里来看一下,Thread 类的构造方法,Thread 类的构造方法有若干个,现在主要来看它的 无参构造方法 和 传递 Runnable 类型的构造方法,代码如下: public Thread() {...如果此线程是使用单独的 Runnable run 对象构造的,则调用该 Runnable 对象的 run方法;否则,此方法不执行任何操作并返回。接下来通过实例来调试分析一下。...不过 实现 Runnable 接口 的方法应该更符合软件的设计原则。当然了,在项目中不建议显式的创建线程,更推荐的是使用线程池。

52930
  • 多线程(四)—-继承Thread和实现Runnable的区别

    来自于Java当中继承和实现的设计的区别, 继承是单继承,实现可以多实现 当某个类需要升级为线程类的时候,如果这个类已经存在了继承的父类,那么该类不能够继承Thread类, 这是继承的缺陷,但是我们可以实现...实现Runnable的方式不能够直接调用Thread类的API,但是Thread类提供了一个方法: static Thread currentThread() 返回对当前正在执行的线程对象的引用。...通过currentThread能够获取到正在执行的线程对象,从而能够任意地访问Thread类的API 所以实现Runnable的方式这个缺点可以弥补 3....从创建线程的角度发现,继承Thread的方式,每次创建一个线程对象,都会创建一份独有的内部成员 实现Runnable接口的方式,可以实现创建多个线程对象,共享同一个成员,从而实现数据的共享,当多个线程共享同一份数据...,同一份代码的时候,使用实现Runnable的方法更加方便 实际开发中基本上都是采用实现Runnable接口的方式开启线程。

    58720

    Java 继承Thread类和实现Runnable接口的区别

    ava中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2. ...通过实现Runnable接口,实例化Thread类     在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程。...用图表示如下 在我们刚接触的时候可能会迷糊继承Thread类和实现Runnable接口实现多线程,其实在接触后我们会发现这完全是两个不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务...大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。...这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。

    1.6K70

    多线程原理和常用方法以及Thread和Runnable的区别

    sleep(long millis) 创建多线程程序的第二种方式-实现Runnable接口 Thread和Runnable的区别 使用匿名内部类开启线程 多线程原理 随机性打印 CPU有了两条执行的路径...Runnable接口实现多线程的步骤: 创建一个Runnable接口的实现类 在实现类中重写Runnable接口的run方法,设置线程任务 创建一个Runnable接口的实现类对象 创建Thread类对象...和Runnable的区别 实现Runnable接口创建多线程程序的好处: 避免了单继承的局限性 一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类。...实现了Runnable接口,还可以继承其他的类,实现其他的接口。 增强了程序的扩展性,降低了程序的耦合性(解耦) 实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)。...实现类中,重写了run方法:用来设置线程任务。 创建Thread类对象,调用start方法:用来开启新线程。 使用匿名内部类开启线程 匿名内部类开启线程可以简化代码的编码。

    22920

    Java中实现多线程继承Thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1. 通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2....通过实现Runnable接口,实例化Thread类 在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票窗口相当于各个线程。...在我们刚接触的时候可能会迷糊继承Thread类和实现Runnable接口实现多线程,其实在接触后我们会发现这完全是两个不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。...大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。...这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。 转载:https://www.cnblogs.com/zhaosq/p/9882102.html

    1.8K10

    Java-多线程:Callable接口和Runnable接口之间的区别

    Callable接口和Runnable接口之间的区别 一、源代码角度分析两接口间的区别 想学习好Future设计模式,我们应当首先将Callable、以及Runnable接口之间的区别弄明白: 不妨首先给出他们俩的源代码...而thread类只支持runnable 它们的相同点: 两者都是接口 两者都需要调用Thread.start启动线程 二、从使用场景来分析两接口间区别: 2.1 Runnnable接口的使用场景 1)传递给线程对象执行任务...(); new Thread(runnableTask).start(); //4)Runnable类以及其子类作为线程任务提交给线程池,通过线程池维护的工作者线程来执行...但是Runnable接口和Callable接口在线程池上的应用实际上是十分类似的。  ...接口以及FutureTask类上Runnable接口和Callable接口的异同,这样一来我们可以对此有一个更深层次的认识;但是不妨,将此内容放在我的另外一篇博客中。

    7.5K20

    面试官:除了继承Thread类和实现Runnable接口,你知道使用Callable接口的方式来创建线程吗?

    为何要使用Callable来创建线程? 对一个变量n,初始化为0,我们使用实现Runnable接口的方式创建一个线程来对其进行一次n++操作,看看能得到我们预期的结果吗?...,这是因为main线程和t1线程是并发执行的,n在什么时候修改不清楚 我们使用线程通信的方式对上述代码进行改造来达到我们预期的结果 public class MyCallable { private...❗❗❗但是使用这种方式来达到我们预期结果,使用到了加锁释放锁,线程通信一系列操作,比较繁琐,所以我们需要使用Callable接口创建线程的方式来返回线程执行的结果 Callable的使用方式...返回值为task.get(),当前线程阻塞等待task执行完毕并返回结果后,再执行当前线程后续任务 关于Callable: Callable和Runnable都是描述一个任务,Callable...描述的是带有返回值的任务,Runnable描述的是不带返回值的任务 Callable重写call方法,Runnable重写run方法 Callable搭配FutureTask来使用,FutuerTask

    15420

    【JavaSE专栏77】线程的创建和启动,继承Thread类或实现Runnable接口完成线程创建启动

    一、什么是进程和线程 在 Java 中,进程是指正在运行的一个程序的执行实例,它是操作系统进行资源分配和调度的基本单位,每个进程都有自己的内存空间、文件描述符、运行时环境等,进程之间是相互独立的,彼此之间不共享内存空间...线程是进程内的一个执行路径,一个进程可以包含多个线程,这些线程共享进程的内存空间和其他资源,线程是执行计算机程序的最小单位,它可以独立执行任务,也可以协作合作与其他线程共同完成任务,线程之间的调度和切换由操作系统的线程调度器负责...与进程相比,线程的创建和销毁开销较小,切换速度也较快,线程之间可以共享同一个进程的数据,因此线程之间的通信更加方便。多线程的并发执行可以提高程序的效率和响应速度。...(runnable); thread.start(); // 启动线程 } } 这两种方式都可以用来创建线程,但推荐同学们使用第二种方式,即实现 Runnable 接口,这是因为...Java是单继承的,如果已经继承了其他类,就无法再继承 Thread 类,而实现 Runnable 接口没有这个限制,还可以更好地实现代码的解耦。

    22420

    Java多线程学习(二)——Thread类的方法使用

    Thread类的一些方法介绍 1、currentThread()方法 currentThread()方法可以返回代码被那个线程调用的信息。...有以下三种方法终止正在运行中的线程: 使用退出标志,使线程正常退出,就是当run方法完成后终止线程; 使用stop方法钱箱终止线程,但是不推荐,因为stop和suspend及resume一样是过期作废方法...调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真的停止线程。所以引出this.interrupted()和this.isInterrupted()方法。...所以使用interrupt()时需要判断线程是否有中断标志,在使用return或者抛异常的方式中断此线程。 5.2 stop()方法 stop方法是暴力停止线程,已经弃用的方法不建议使用。...可以通过调用Thead类的setDaemon(true)方法设置当前的线程为守护线程。

    64930

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

    一、初识 java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。...每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。...如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。...= null) { target.run(); } } 五、真正理解Thread类 Thread类的对象其实也是一个java对象,只不过每一个Thread类的对象对应着一个线程...Thread类的对象就是提供给用户用于操作线程、获取线程的信息。真正的底层线程用户是看不到的了。

    3K00

    线程的创建、Lambda函数式接口?Runnable和Callable之间的适配?动态修改线程任务?这里带你图解Java线程池

    线程的创建、Lambda函数式接口?Runnable和Callable之间的适配?动态修改线程任务?...这里带你图解Java线程池Java线程创建的方式继承Thread类,重写run方法重写Runnable接口,交给Tread类静态代理实现实现Callable接口,用FutureTask封装实现Runnable...实现Runnable接口 // 对于有 @FunctionalInterface 的类 or 接口,我们可以使用lambda表达式来简化,当然 // 没有这个注解也可以,...来看看源码吧,先来看看是如何做到Runnable和Callable之间的适配的 public FutureTask(Callable callable) { if (callable...如何动态修改Thread的run方法 —— 线程池实现的猜想(结果肯定是事与愿违,只是鼠人的一种猜想罢了)好了,刚才讲到,我们可以用FutrueTask来封装Runnable和Callable(那么我封装自己也可以吧

    85581

    Java 多线程 Thread 和 Runnable

    同时runnable状态不会直接进入blocked和terminated状态,runnable只会意外终止和running状态....Crash 阻塞结束,完成休眠,唤醒,拿到锁资源进入runnable 线程Terminated 线程正常结束生命周期 线程意外结束 Jvm Crash 线程结束 2.run()和start()...Thread run 和 Runnable run 区别 首先,实现线程的执行单元有两种方式, 重写 Thread 的 run 方法 实现Runnable接口的 run 并将 Runnable 实例用作构造...Thread的参数 无论Runnable和Thread都是实现Runnable的接口 实质:Thread 类中调用 Runnable 实现的重写run接口 Thread 的 run 方法是不能共享的,...A 线程不能把B的run当自己的资源,实现资源共享使用static Runnable 只要使用同一个Runnable,构造不同的Thread实例,就可以资源共享.

    52410

    使用图生成多任务模型缩小基于靶标和基于细胞的药物发现之间的差异

    另一个原因是体外纯化的靶酶与体内天然靶酶之间的差异,蛋白质结构可能因体外和体内环境而异,从而改变药物与靶蛋白之间的结合亲和力。...针对SARS-CoV-2的药物开发,作者提出一种框架来缩小基于靶标和基于细胞的药物发现之间的差异。如图 1 所示,框架包括两部分:预测器和生成器。...Gate1收集3CL的特定信息,共享信息和原始分子输入,得到3CL抑制任务的分子表示向量。Gate2类似地生成用于抗病毒任务的分子表示向量。...表1. 3CLpro 和抗病毒数据集的模型性能比较 靶点抑制化合物和细胞活性化合物之间的差异 有研究表明3CLpro抑制作用与抗病毒作用之间没有普遍的相关性,即化合物对3CLpro的高抑制活性不能保证其抗病毒作用...作者希望通过MATIC模型提取在 3CL 和抗病毒任务中重要的子结构,然后使用这些子结构生成新的多属性分子。为了缩小不同任务之间侧重不同的功能组的差异,作者使用了多种多目标分子优化的方法。

    42110

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

    一、初识 java的线程是通过java.lang.Thread类来实现的。VM启动时会有一个由主方法所定义的线程。可以通过创建Thread的实例来创建新的线程。...每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。...如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。...= null) { 3 target.run(); 4 } 5} 五、真正理解Thread类 Thread类的对象其实也是一个java对象,只不过每一个Thread类的对象对应着一个线程...Thread类的对象就是提供给用户用于操作线程、获取线程的信息。真正的底层线程用户是看不到的了。

    38820

    张三并发编程实践:创建高效的多线程世界

    Thread类负责管理线程的生命周期、状态和其他相关属性,而Runnable接口则定义了线程的任务内容。...Thread 和 Runnable 解析 Thread 类Thread类是Java中用于实现多线程的核心类。它实现了Runnable接口,并提供了许多与线程相关的方法。...在使用这些方法时,需要注意线程安全和同步问题,以避免出现意外的行为和性能问题。run()如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法。...它的核心在于有效地管理和协调不同线程之间的执行顺序和数据访问,以确保程序的正确性和性能。这就要求我们在设计多线程程序时,必须仔细考虑线程间的同步和互斥问题,防止数据竞争和资源争用。...在某些情况下,线程之间需要相互等待或通知对方完成任务,这时就需要用到线程间的通信机制,如wait()、notify()和notifyAll()等。

    35021

    Java(6)-java线程

    创建线程 在 Java程序中,创建线程方法: 一是对 Thread 类进行派生并覆盖 run方法; 二是通过实现 runnable接口创建,当你打算多重继承时,优先选择实现Runnable。...继承Thread 类并覆盖 Thread类的 run 方法完成线程类的声明, 通过new创建派生线程类的线程对象。run 中的代码实现了线程的行为。...java.lang.Thread 类是一个通用的线程类,由于默认情况下 run 方法是空的,直接通过 Thread类实例化的线程对象不能完成任何事,所以可以通过派生 Thread 类,并用具体程序代码覆盖...除非你需要重写Thread类除了Run()方法外的其他方法来自定义线程,否则不建议使用继承Thread的方式来创建。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应将类归为子类。 三....2、Sleep()、suspend()和wait()之间有什么区别? Thread.sleep()使当前线程在指定的时间处于“非运行”(Not Runnable)状态。线程一直持有对象的监视器。

    3K21

    Java岗 面试考点精讲(基础篇01期)

    简单说下什么是跨平台 术语:操作系统指令集、屏蔽系统之间的差异 由于各种操作系统所支持的指令集不是完全一致,所以在操作系统之上加个虚拟机可以来提供统一接口,屏蔽系统之间的差异。 2....封装: 把描述一个对象的属性和行为的代码封装在一个模块中,也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象中的属性。 抽象: 把现实生活中的对象抽象为类。...分为过程抽象和数据抽象 数据抽象 -->鸟有翅膀,羽毛等(类的属性) 过程抽象 -->鸟会飞,会叫(类的方法) 继承:子类继承父类的特征和行为。...String、StringBuffer和StringBuilder区别 java中String、StringBuffer、StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题...我们看看Thread类的源码, ,我们可以看到Thread实现了Runnable接口,而Runnable接口里有一个run方法。 所以,我们最终调用的重写的方法应该是Thread类的run方法。

    38630

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

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

    1.1K50
    领券