Java中Runnable和Thread的区别

Java Runnable接口详解及代码示例 Java中的Runnable接口是一个功能接口,用于定义可以在单独线程中执行的任务。通过实现Runnable接口,可以将任务封装在一个可执行对象中,并在需要时通过线程来执行。Runnable接口位于java.lang包中,它是一个函数式接口,只包含一个抽象方法。步骤2:实现Runnable接口的run()方法,在该方法中定义线程要执行的任务逻辑。方法中,我们定义了线程要执行的任务逻辑,这里只是简单地打印一条消息。的类,实现了Runnable接口,并重写了。在上面的示例中,我们创建了一个名为。 阅读详情

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。

下面看例子:

 
  1. package org.thread.demo;  
  2. class MyThread extends Thread{  
  3. private String name;  
  4. public MyThread(String name) {  
  5. super();  
  6. this.name = name;  
  7. }  
  8. public void run(){  
  9. for(int i=0;i<10;i++){  
  10. System.out.println("线程开始:"+this.name+",i="+i);  
  11. }  
  12. }  
  13. }  
  14. package org.thread.demo;  
  15. public class ThreadDemo01 {  
  16. public static void main(String[] args) {  
  17. MyThread mt1=new MyThread("线程a");  
  18. MyThread mt2=new MyThread("线程b");  
  19. mt1.run();  
  20. mt2.run();  
  21. }  
  22. } 

但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。在JDK的文档中可以发现,一旦调用start()方法,则会通过JVM找到run()方法。下面启动start()方法启动线程:

 
  1. package org.thread.demo;  
  2. public class ThreadDemo01 {  
  3. public static void main(String[] args) {  
  4. MyThread mt1=new MyThread("线程a");  
  5. MyThread mt2=new MyThread("线程b");  
  6. mt1.start();  
  7. mt2.start();  
  8. }  
  9. }; 

这样程序可以正常完成交互式运行。那么为啥非要使用start();方法启动多线程呢?

在JDK的安装路径下,src.zip是全部的java源程序,通过此代码找到Thread中的start()方法的定义,可以发现此方法中使用了private native void start0();其中native关键字表示可以调用操作系统的底层函数,那么这样的技术成为JNI技术(java Native Interface)

Runnable接口

在实际开发中一个多线程的操作很少使用Thread类,而是通过Runnable接口完成。

 
  1. public interface Runnable{  
  2. public void run();  
  3. } 

例子:

 
  1. package org.runnable.demo;  
  2. class MyThread implements Runnable{  
  3. private String name;  
  4. public MyThread(String name) {  
  5. this.name = name;  
  6. }
  7. public void run(){  
  8. for(int i=0;i<100;i++){  
  9. System.out.println("线程开始:"+this.name+",i="+i);  
  10. }  
  11. }  
  12. }; 

但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。此时观察Thread类,有一个构造方法:public Thread(Runnable targer)此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。(start()可以协调系统的资源):

 
  1. package org.runnable.demo;  
  2. import org.runnable.demo.MyThread;  
  3. public class ThreadDemo01 {  
  4. public static void main(String[] args) {  
  5. MyThread mt1=new MyThread("线程a");  
  6. MyThread mt2=new MyThread("线程b");  
  7. new Thread(mt1).start();  
  8. new Thread(mt2).start();  
  9. }  
  10. } 

两种实现方式的区别和联系:

在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

  • 避免点继承的局限,一个类可以继承多个接口。
  • 适合于资源的共享

以卖票程序为例,通过Thread类完成:

 
  1. package org.demo.dff;  
  2. class MyThread extends Thread{  
  3. private int ticket=10;  
  4. public void run(){  
  5. for(int i=0;i<20;i++){  
  6. if(this.ticket>0){  
  7. System.out.println("卖票:ticket"+this.ticket--);  
  8. }  
  9. }  
  10. }  
  11. }; 

下面通过三个线程对象,同时卖票:

 
  1. package org.demo.dff;  
  2. public class ThreadTicket {  
  3. public static void main(String[] args) {  
  4. MyThread mt1=new MyThread();  
  5. MyThread mt2=new MyThread();  
  6. MyThread mt3=new MyThread();  
  7. mt1.start();//每个线程都各卖了10张,共卖了30张票  
  8. mt2.start();//但实际只有10张票,每个线程都卖自己的票  
  9. mt3.start();//没有达到资源共享  
  10. }  
  11. } 

如果用Runnable就可以实现资源共享,下面看例子:

 
  1. package org.demo.runnable;  
  2. class MyThread implements Runnable{  
  3. private int ticket=10;  
  4. public void run(){  
  5. for(int i=0;i<20;i++){  
  6. if(this.ticket>0){  
  7. System.out.println("卖票:ticket"+this.ticket--);  
  8. }  
  9. }  
  10. }  
  11. }  
  12. package org.demo.runnable;  
  13. public class RunnableTicket {  
  14. public static void main(String[] args) {  
  15. MyThread mt=new MyThread();  
  16. new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一  
  17. new Thread(mt).start();//个实例化对象mt,就会出现异常  
  18. new Thread(mt).start();  
  19. }  
  20. }; 

虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。

Runnable接口和Thread之间的联系:

public class Thread extends Object implements Runnable

发现Thread类也是Runnable接口的子类。

原文链接:http://blog.youkuaiyun.com/wwww1988600/article/details/7309070

electron windows设置镜像地址环境变量报错npm error `ELECTRON_MIRROR` is not a valid npm option 如果你是在使用某个特定的脚本或配置文件,请检查该文件中是否有不正确的配置项,并进行相应的修正。确保你遵循electron的官方安装指南,并且没有包含不必要的或错误的配置选项。如果问题依然存在,可以查看npm的官方文档或者相关社区获取更多帮助。 阅读详情

相关推荐

毕业论文管理系统的设计与实现

毕业论文工作是高等学校本科培养阶段的一个重要环节。目前论文管理工作存在着许多问题,例如人工管理极为不便;学生对论文所要撰写的内容并不十分了解,与指导老师的沟通非常不便;老师的指导监督也很难完全到位;手工评审的效率低等。而现有的一些毕业论文信息管理或答辩评审系统只是实现了部分网上交流和评审管理的功能,在答辩评审的自测和项目指标权重等方面都存在着一定的不足。因此,本文设计的毕业论文管理系统采用B/S模式开发。其中,Browser层使用JSP技术开发;

wqq_992250277的博客 3183

Runnable 和 Thread 有什么区别

线程状态:创建Thread对象后,可以直接调用start()方法启动线程,而使用Runnable需要先创建Thread对象,然后将Runnable对象传递给Thread对象,最后调用start()方法启动线程。如果需要对线程类进行自定义的扩展,例如重写Thread类的方法来改变线程的行为,那么继承Thread类就是一个不错的选择。继承性:Thread是一个类,因此如果继承Thread类,子类就不能再继承其他的类了,而实现Runnable接口可以继承其他类,这样可以避免Java中单继承带来的限制。

qq_30667039的博客 4391

FPGA波束形成:从算法到硬件的艺术之旅

本文深入探讨了FPGA在波束形成技术中的应用,从算法原理到Verilog硬件实现的全过程。文章详细分析了FPGA并行处理、低延迟和可重构特性如何优化波束形成系统性能,并提供了Verilog关键模块代码示例和资源优化策略,为工程师实现高效FPGA波束形成解决方案提供实用指导。

tea88的博客 1044

Thread 和 Runnable 的区别

今天在学习多线程的时候,了解了 创建线程的几种方式,然后就脑子发热,突然想到 Thread 和 Runnable 创建线程有什么区别吗?毕竟是长得都不一样。所以我就找了一些资料(优快云 大佬们的文章)来看看,有了一些理解。 明确一点:Runnable 和 Thread 本质上是没有区别的。 区别 如果非要说区别的话,那么就有一下几点 Runnable 和 Thread 创建线程的方式不一样 Runnable 是接口,Thread 是实体类,Thread 和 Runnable 的关系就是实体与实现.

就这样吧 4780

从零开始理解固定翼能量控制:Pixhawk TECS算法保姆级教程

本文深入解析了Pixhawk飞控中的TECS(总能量控制)算法,旨在解决固定翼无人机纵向控制中速度与高度耦合的经典难题。教程从物理概念出发,阐释了TECS通过管理总能量与分配能量形态来实现油门与升降舵解耦的核心思想,并提供了参数调试的实战指南,帮助开发者优化飞行性能。

white的博客 249

差分运放电路输出电压偏置设计解析

差分运算放大电路是信号处理中的基础模块,通过差分对管结构实现共模抑制与差模放大。其核心原理基于运放的虚短虚断特性,当电阻网络满足对称条件时,输出电压与输入差分成正比。在工业测量系统中,由于ADC通常仅支持正电压输入,需要通过偏置电路将双极性信号平移至正电压范围。典型设计采用精密基准电压源和匹配电阻网络,既保持信号完整性又满足系统接口要求。本文以-100V高压测量为例,详细解析了分压网络设计、参考电压选取以及电阻匹配等关键技术要点,为传感器接口电路设计提供实践参考。

weixin_35750747的博客 470

两种线程:Runable与Thread区别详解

前言:由于毕业

启舰 8861

【Windows Server 2019】活动目录 (Active Directory) ——理论

博文介绍了活动目录 (Active Directory) 的定义,作用以及与 DNS 的关系。同时也介绍了AD的组织结构,包括域控制器,子域,对象,属性,容器,组织单位,域间信任等术语的解释,实验拓扑图。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 7747

Java里Thread和Runnable区别?

在Java中,Thread和Runnable是实现多线程的两种主要方式,但它们在使用和功能上有显著差异。Thread是一个类,通过继承并重写run()方法来定义线程逻辑,每次启动线程需调用start()方法,但受限于Java的单继承特性,灵活性较低。相比之下,Runnable是一个接口,通过实现run()方法定义任务逻辑,再由Thread对象启动线程,支持多重继承,更适合多线程共享任务。此外,Runnable与线程池的兼容性更好,能够更有效地管理资源。因此,推荐使用Runnable,尤其是在需要线程池或资源

weixin_46072507的博客 711

ASP.NET Core 6 Web API在IIS上的部署与调试

通过以上步骤和配置,你应该能够成功部署并调试你的ASP.NET Core 6 Web API在IIS上。记住,权限和配置是关键,确保你的环境和应用程序代码都正确设置。希望这篇博客对你部署和解决IIS上的问题有所帮助。

m0_74337424的博客 522

Python爬虫实战:逆向工程与异步处理攻克Pinterest无限滚动瀑布流

我们将从零开始,逐步分析其数据接口,构建一个功能完整的爬虫,并深入探讨反爬虫策略的应对、性能优化以及数据存储等高级主题。: 在实际爬取中,你需要先访问一次Pinterest主页,获取初始的Cookie和CSRF Token,然后再发起API请求。: Python爬虫,Pinterest,无限滚动,瀑布流,异步IO,httpx,逆向工程,API接口,动态内容,反爬虫。你会很快发现一些关键的请求模式。:页面初始加载有限内容,随着用户滚动,新的图片块通过AJAX动态加载,实现“永无止境”的浏览。

2201_76125261的博客 551

java thread和runnable_详解Java中Thread 和Runnable区别|chu

Thread 和Runnable 关系Thread类是接口Runnable的一个实现类。public class Thread implements Runnable源码分析Thread Threa类运行的时候调用start()方法,源代码如下:调用start()方法,实际运行的是start0方法,方法声明如下:private native void start0()native表明这个方法是个原...

weixin_42300478的博客 259

基于 Qt C++ 的 2D 动画制作工具

你可以修改它的中心坐标 (X, Y)、宽度 (W)、高度 (H),或点击 "选择颜色" 按钮改变其填充色。* **图形视图 (`QGraphicsView` 和 `QGraphicsScene`)**: 用于显示和编辑当前帧的内容。

寒寒豆豆软件公司的博客 114

【Java】Thread和Runnable的区别

Thread和Runnable的区别 1.避免了单继承的局限性 一个类只能继承一个类(一个人只能有一个亲爹),类继承了Thread类就不能继承其他的类 实现了Runnable接口,还可以继承其他的类,实现其他的接口 2.增强了程序的扩展性,降低了程序的耦合性(解耦) 实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦) 实现类中,重写了run方法,用来设置线程任务 创建Thread类对象,调用start方法,用来开启新线程 publ...

以梦为马,不日抵达。 246

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java源码之深入解析Runnable和Thread的区别

我们都知道创建一个线程有两种方式一是继承Thread,一是实现Runnable接口。 那么java面试基本必问的一个问题就是这两种方式有什么区别。 其实区别有很多,简单讲Thread类本身也是实现了Runnable接口的。 所以继承了Thread类的线程类 都拥有实现Runnable接口的基本特性,但是实现了Runnable接口的线程类却不一定有Thread类的一些特性。 看看源码吧更清晰一点: ...

Phoenix_smf的博客 575

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java中通过Runnable与Thread创建线程的区别

1 、Java中的Thread与Runnable 1:在Java并发模型中,Thread是跟操作系统底层的线程一对一对应的,Thread对应一个真实的操作系统线程。 2:Runnable只是一个线程执行代码片段的接口标准之外,其余跟线程关系根本不是很大(可以理解:Runnable是一个线程的Task抽象)。Runnable可以理解为线程执行代码的一个单元(juc中Callable也是一个接口标...

吟啸徐行 1926

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Thread Runnable java_浅析Java中Runnable和Thread的区别

线程的起动并不是简单的调用了你的RUN方法,而是由一个线程调度器来分别调用你的所有线程的RUN方法,我们普通的RUN方法如果没有执行完是不会返回的,也就是会一直执行下去,这样RUN方法下面的方法就不可能会执行了,可是线程里的RUN方法却不一样,它只有一定的CPU时间,执行过后就给别的线程了,这样反复的把CPU的时间切来切去,因为切换的速度很快,所以我们就感觉是很多线程在同时运行一样.你简单的调用r...

weixin_42299140的博客 204

java中runnable_Java中Runnable和Thread的区别

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。下面看例子:packageorg.thread.demo;class MyThread extendsThread{priva...

weixin_30562541的博客 178

Java中Runnable和Thread区别

Java中Runnable和Thread区别本来这篇文章是要开始讲讲Handler消息传递机制的。无奈里面牵涉了我不太熟悉的Runnable跟Thread,在学习android前,啃了一段时间的java,但是并没有花太多时间研究。没办法,先把基础打牢实了。Java多线程java中有两种实现多线程的方式: 1. 一种是通过继承Thread类,同时重写run()方法。但是java中,只允许单继承,也

封神之路的博客 520

Java线程中,Thread和Runnable创建线程的区别

一、Thread创建线程,通过新建类继承Thread类,重写run方法,然后在main方法中start(),创建并启动线程. public class MyThread extends Thread{//除了构造方法和私有属性其他的都可以被继承下来 @Override//重写了父类Thread的run方法. //在main方法start()创建并启动线程时,会调用此方法. pu...

Doppelganger 2770
上一篇: SSH Secure Shell Client 中文乱码解决方法
下一篇: java.lang.OutOfMemoryError:GC overhead limit exceeded解决方法
andybbc
博客等级 码龄11年 64粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值