Java多线程两种实现方式的对比
一种,直接继承Thread类
一种,实现Thread类的Runnable接口

两种方式的区别

比如,售票厅有四个窗口,可以发售某日某次列出的100张车票,此时,100张车票可以看作是共享资源,四个售票窗口需要创建四个线程
可以通过Thread的currentThread()方法,得到当前的线程的实例对象,然后,调用getName()方法,可以获取到线程的名称

继承Thread类,实现多线程

示例,Example04.java

public class Example04{public static void main(String[] args){new TicketWindow().start();     // 创建一个线程对象TicketWindows并开启new TicketWindow().start();     // 创建一个线程对象TicketWindows并开启new TicketWindow().start();     // 创建一个线程对象TicketWindows并开启new TicketWindow().start();     // 创建一个线程对象TicketWindows并开启}
}
class TicketWindow extends Thread{private int tickets=100;public void run(){// 通过死循环语句,打印语句while(true){if (tickets>0){// 获取当前线程// 获取当前线程的名称Thread th=Thread.currentThread();String th_name=th.getName();System.out.println(th_name+"正在发售第"+tickets--+"张票");}}}}

编译运行

可以看出,每张票都被打印了四次
原因,四个线程没有共享100张票,而是各自出售了100张票
在程序中创建了四个TicketWindow对象,就等于创建了四个售票程序,每个程序中都有100张票,每个线程在独立的处理各自的资源

注意,每个线程都有自己的名字,主线程默认的名字为main,用户创建的第一个线程的默认名字为Thread-0,第二个线程的默认名字为Thread-1,依次类推,如果,希望指定线程的名称,可以通过调用setName(String name)为线程设置名称

由于,现实生活中,系统中的车票资源是共享的,显然上面的运行结果不合理
为了保证资源共享,在程序中只能创建一个售票对象,然后,开启多个线程去运行同一个售票对象的售票方法,简单来说,就是四个线程运行同一个售票程序,此时,就需要用到线程的第二种实现方式

实现Runnable接口,实现多线程

示例,Example05.java

public class Example05{public static void main(String[] args){TicketWindow tw=new TicketWindow();new Thread(tw,"窗口1").start();       // 创建线程对象,并命名为窗口1,开启线程new Thread(tw,"窗口2").start();       // 创建线程对象,并命名为窗口2,开启线程new Thread(tw,"窗口3").start();       // 创建线程对象,并命名为窗口3,开启线程new Thread(tw,"窗口4").start();       // 创建线程对象,并命名为窗口4,开启线程}
}
class TicketWindow implements Runnable{private int tickets=100;public void run(){while(true){if (tickets>0){// 获取当前线程// 呼气当前线程的名称Thread th=Thread.currentThread();String th_name=th.getName();System.out.println(th_name+"正在发售第"+tickets--+"张票");}}}
}

编译运行

代码说明
只创建了一个TicketWindow对象,然后,创建了四个线程,在每个线程上都去调用TicketWindow对象中的run()方法,这样,就可以保证四个线程访问的是同一个tickets变量,共享100张车票

可以看出,实现Runnable接口,相对于继承Thread类来说

优势如下

1、适合多个相同程序代码的线程,去处理同一个资源的情况,把线程同程序代码、数据有效的分离,很好的体现了面向对象的设计思想

2、可以避免由于Java的单继承,带来的局限性
在程序中,经常遇到这种情况,就是使用一个已经继承了某一个类的子类,创建线程,由于,一个类不能同时有两个父类,所以,不能用继承Thread类的方式,那么,只能采用实现Runnable接口的方式

实际中,大多数应用程序都会采用,实现Runnable接口的方式来创建多线程

Java多线程两种实现方式的对比相关推荐

  1. java 多线程两种方式_JAVA多线程实现的两种方式

    java多线程实现方式主要有两种:继承Thread类.实现Runnable接口 1.继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了 ...

  2. tf dense layer两种创建方式的对比和numpy实现

    文章目录 1 Dense Layer 2 对比原始的add layer方法和继承方法的不同 2.1 global config 2.1 用add实现 2.2 用继承实现 3 有权重的对比 3.1 用自 ...

  3. Spark对Kafka两种连接方式的对比——Receiver和Direct

    在知乎 Flink 取代 Spark Streaming 的实战之路中,提到 因此下面对两种方式进行详细说明一下. Receiver方式 Receiver:接收器模式是使用Kafka高级Consume ...

  4. 等额本金和等额本息两种贷款方式的比较

    等额本金和等额本息两种贷款方式的对比 本文介绍两种还款方式:等额本金.等额本息.通过分析认为等额本金的偿还方式更加划算. 等额本金:每个月偿还相同本金分额,并且支付上个月剩余本金产生的利息. 等额本息 ...

  5. java 同步方式 lock_java的两种同步方式, Synchronized与ReentrantLock的区别

    java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...

  6. Java两种排序方式快慢比较

    2019独角兽企业重金招聘Python工程师标准>>> Java中List的排序方式有两种,现在我们测试下这两种排序方式的快慢吧,我们需要用到两个类, 一个是运行程序的Main类,另 ...

  7. Java框架篇---spring aop两种配置方式

    Java框架篇---spring aop两种配置方式 第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步:  1. 使用注解@Aspect来定义一个切面,在切面中 ...

  8. 多线程python实现方式_python多线程的两种实现方式(代码教程)

    本篇文章给大家带来的内容是关于python多线程的两种实现方式(代码教程),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 线程是轻量级的进程,进程中可划分出多个线程,线程可独立的调度 ...

  9. java map遍历_Java中Map集合的两种遍历方式

    Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下Java中Map集合的两种遍历方式! 关于遍历Map集合的几 ...

最新文章

  1. React native 项目进阶(redux, redux saga, redux logger)
  2. 第11章:MongoDB-CRUD操作--文档--查询
  3. protobuf的ParseFromArray 解析失败的问题
  4. 网络知识科普 | 你未必了解的DNS
  5. 阿里云智能编码idea插件:Alibaba Cloud AI Coding Assistant
  6. 如何查看一个网站是否部署了SSL证书?
  7. (3)[wp7数据存储] WP7 IsolatedStorage系列篇——通过XmlSerializer读写XML文件 [复制链接]...
  8. cesium 设置地球默认区域为中国 一键返回默认区域
  9. JAVA程序员面试总结,高手整整理加强版
  10. j计算机一级考试题,2017全国计算机一级考试试题与答案
  11. Dapper在.Net中的使用(二)
  12. linux系统函数 utime,utime函数
  13. 无法同步谷歌日历_这场科技发布会上,谷歌究竟更新了啥?
  14. 大数据知识面试题-Flink(2022版)
  15. 旺旺打标工具,淘宝搜索打标软件(含旺旺打标API接口)
  16. js正则表达式 URL格式匹配详解
  17. 服务器运行bat文件闪退,win10运行bat文件一闪而过怎么办_网站服务器运行维护
  18. Java虚拟机—JVM
  19. Java 2023发展趋势
  20. 隐私计算技术实现数据要素安全可信流通

热门文章

  1. Intent 匹配规则
  2. POJ3185 The Water Bowls(反转法or dfs 爆搜)
  3. 数据库字段设置为非空默认值
  4. XGBoost Plotting API以及GBDT组合特征实践
  5. C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数引擎 vs rand 函数
  6. Hyperledger Fabric 三种node节点 (1) 基本概念
  7. 区块链BaaS云服务(12)易居(中国) 房地产 EBaaS(Estate Blockchain as a Service)
  8. STL 中的 accumulate(C++)
  9. python——常用内置函数(enumerate、map、zip、eval)用法
  10. DRF—Mixin拓展类、视图集