Java多线程两种实现方式的对比
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多线程两种实现方式的对比相关推荐
- java 多线程两种方式_JAVA多线程实现的两种方式
java多线程实现方式主要有两种:继承Thread类.实现Runnable接口 1.继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了 ...
- tf dense layer两种创建方式的对比和numpy实现
文章目录 1 Dense Layer 2 对比原始的add layer方法和继承方法的不同 2.1 global config 2.1 用add实现 2.2 用继承实现 3 有权重的对比 3.1 用自 ...
- Spark对Kafka两种连接方式的对比——Receiver和Direct
在知乎 Flink 取代 Spark Streaming 的实战之路中,提到 因此下面对两种方式进行详细说明一下. Receiver方式 Receiver:接收器模式是使用Kafka高级Consume ...
- 等额本金和等额本息两种贷款方式的比较
等额本金和等额本息两种贷款方式的对比 本文介绍两种还款方式:等额本金.等额本息.通过分析认为等额本金的偿还方式更加划算. 等额本金:每个月偿还相同本金分额,并且支付上个月剩余本金产生的利息. 等额本息 ...
- java 同步方式 lock_java的两种同步方式, Synchronized与ReentrantLock的区别
java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock. 相似点: 这两种同步方式有很多相似之处,它们都是加锁 ...
- Java两种排序方式快慢比较
2019独角兽企业重金招聘Python工程师标准>>> Java中List的排序方式有两种,现在我们测试下这两种排序方式的快慢吧,我们需要用到两个类, 一个是运行程序的Main类,另 ...
- Java框架篇---spring aop两种配置方式
Java框架篇---spring aop两种配置方式 第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步: 1. 使用注解@Aspect来定义一个切面,在切面中 ...
- 多线程python实现方式_python多线程的两种实现方式(代码教程)
本篇文章给大家带来的内容是关于python多线程的两种实现方式(代码教程),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 线程是轻量级的进程,进程中可划分出多个线程,线程可独立的调度 ...
- java map遍历_Java中Map集合的两种遍历方式
Java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下Java中Map集合的两种遍历方式! 关于遍历Map集合的几 ...
最新文章
- React native 项目进阶(redux, redux saga, redux logger)
- 第11章:MongoDB-CRUD操作--文档--查询
- protobuf的ParseFromArray 解析失败的问题
- 网络知识科普 | 你未必了解的DNS
- 阿里云智能编码idea插件:Alibaba Cloud AI Coding Assistant
- 如何查看一个网站是否部署了SSL证书?
- (3)[wp7数据存储] WP7 IsolatedStorage系列篇——通过XmlSerializer读写XML文件 [复制链接]...
- cesium 设置地球默认区域为中国 一键返回默认区域
- JAVA程序员面试总结,高手整整理加强版
- j计算机一级考试题,2017全国计算机一级考试试题与答案
- Dapper在.Net中的使用(二)
- linux系统函数 utime,utime函数
- 无法同步谷歌日历_这场科技发布会上,谷歌究竟更新了啥?
- 大数据知识面试题-Flink(2022版)
- 旺旺打标工具,淘宝搜索打标软件(含旺旺打标API接口)
- js正则表达式 URL格式匹配详解
- 服务器运行bat文件闪退,win10运行bat文件一闪而过怎么办_网站服务器运行维护
- Java虚拟机—JVM
- Java 2023发展趋势
- 隐私计算技术实现数据要素安全可信流通
热门文章
- Intent 匹配规则
- POJ3185 The Water Bowls(反转法or dfs 爆搜)
- 数据库字段设置为非空默认值
- XGBoost Plotting API以及GBDT组合特征实践
- C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数引擎 vs rand 函数
- Hyperledger Fabric 三种node节点 (1) 基本概念
- 区块链BaaS云服务(12)易居(中国) 房地产 EBaaS(Estate Blockchain as a Service)
- STL 中的 accumulate(C++)
- python——常用内置函数(enumerate、map、zip、eval)用法
- DRF—Mixin拓展类、视图集