首页
学习
活动
专区
工具
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 接口 方法应该更符合软件设计原则。当然了,在项目中不建议显式创建线程,更推荐使用线程池。

51630
  • 线程(四)—-继承Thread实现Runnable区别

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

    57120

    Java 继承Thread实现Runnable接口区别

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

    1.6K70

    线程原理常用方法以及ThreadRunnable区别

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

    21920

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

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

    1.7K10

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

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

    7.3K20

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

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

    14020

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

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

    18620

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

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

    63630

    深入线程Threadstart()方法run()方法

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

    2.9K00

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

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

    70481

    Java 多线程 Thread Runnable

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

    51110

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

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

    40210

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

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

    37620

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

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

    33421

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

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

    37530

    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

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

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

    1K50
    领券