Java多线程两种实现

2023-11-09

在java中实现多线程的方式有两种,一种是继承Thread类,另一个是实现Runnable接口。

对于两种实现,各有优缺点。接下来进行对比总结一下。这两种方法,都可以实现多线程。

以下为两种实现的写法


继承Thread类的方式:

package com.zc.thread;

public class MyThread extends Thread {
	private String name;

	public MyThread(String name) {
		super();
		this.name = name;
	}

	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("线程开始:" + this.name + ",i=" + i);
		}
	}
}


实现Runnable接口的方式:

package com.zc.runnable;

public class MyRunnable implements Runnable {
	private String name;

	public MyRunnable(String name) {
		this.name = name;
	}

	public void run() {
		for (int i = 0; i < 10; i++) {
			System.out.println("线程开始:" + this.name + ",i=" + i);
		}
	}
}

两种方式都可以实现多线程。两种方式的区别基本就是 继承 和实现接口的区别。初次之外,就是实现Runnable接口可以实现资源的共享。

对于继承Thread类,会有一些局限性。因为java中的类不能继承多个类,但是可以实现多个接口。所以实现Runnable多少会有一些便利。


因为这两种方式,就是换汤不换药。Thread类仍然是实现的Runnable接口。



run方法 和 start方法区别:

在以上两种实现多线程的方式中,都需要重写run方法。而要想启动线程,就必须调用该类的start方法。这样JVM才会给分配一个线程。进而实现 多线线程的同步执行。即:start会协调系统的资源。


那么如何实现,多个线程之间的资源共享呢?

首先编写一个自己的Test类

package com.zc.thread;

public class SellThread extends Thread{
	private int ticket = 10;
	@Override
	public void run() {
		for (int i = 0; i < 20; i++) {
			if (this.ticket > 0) {
				System.out.println("卖票:ticket" +",第"+ this.ticket--);
			}
		}
	}
}


该类为一个售票点的运营情况。

如果只有一个售票员的话,那么这个问题就不需要讨论了,这样就是一个单一的线程。直接用即可。

那么如何实现三个售票员的情况呢?接下来看一下下面这种情况:

public class ticketTest {
	public static void main(String[] args) {
		 TicketSellThread tst1=new TicketSellThread();
		 TicketSellThread tst2=new TicketSellThread();
		 TicketSellThread tst3=new TicketSellThread();
		 tst1.start();
		 tst2.start();
		 tst3.start();
	}
}

上面的这种情况是否可以满足 三个售票员的售票点呢?




很显然,售票的情况不对,三个售票员 售出了 总数 那么多的票,是三个人的资源 不共享造成的。


要想实现,三个售票员同享一个资源。那么就应该用同一个Thread去start  三个线程。

public static void main(String[] args) {
        TicketThreadR ticketThread = new TicketThreadR();
        
        Thread th1 = new Thread(ticketThread);    //线程一
        Thread th2 = new Thread(ticketThread);    //线程二
        Thread th3 = new Thread(ticketThread);    //线程三
        
        th1.start();
        th2.start();
        th3.start();
    }

接下来看一下结果:



虽然打印情况不是按照顺序打印的,但是实现了资源共享。

对比来说,实现Runnable类的Thread进行start的时候,会达到资源共享。而如果使用继承Thread的实现方法来调用start资源是得不到共享的。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java多线程两种实现 的相关文章

  • xpath,sax,DOM解析xml文件(基础)

    基础 XML解析器有二类 分别是DOM和SAX DOM DOM解析器在解析XML文档时 会把文档中的所有元素 按照其出现的层次关系 解析成一个个Node对象 节点 很方便对文档进行遍历 对文档curd也特别方便 xml文档比较大的时候 do
  • Tcp协议中的3次握手与4次挥手过程分析

    转载https blog csdn net u012824097 article details 52490091 客户端与服务端的通信中步骤 1建立Tcp连接 3次握手 2再进行数据传输 3数据传输完成后 断开连接 4次挥手 建立Tcp连
  • Java多线程详解(线程同步)

    嗨喽 小伙伴们我来了 上一章 我们通过几个例子 点击跳转 介绍了线程安全问题 而说到线程安全就不得不提到线程同步 它是解决线程安全的一种重要方法 本章就来简单地介绍一下线程同步 从上一章的学习我们知道 当多个线程操作一个资源的时候 有可能由
  • dubbo消费者源码解析

    一 服务消费者核心类ReferenceBean public void afterPropertiesSet throws Exception if applicationContext null BeanFactoryUtils bean
  • 深入理解单例模式:静态内部类单例原理

    本文主要介绍java的单例模式 以及详细剖析静态内部类之所以能够实现单例的原理 OK 废话不多说 进入正文 首先我们要先了解下单例的四大原则 1 构造私有 2 以静态方法或者枚举返回实例 3 确保实例只有一个 尤其是多线程环境 4 确保反序
  • Java多态机制在实际中的应用

    在实际开发工作中 常常遇到一个功能有多种实现方式 比如支付方式 有分微信支付 京东支付 支付宝 银联等支付方式 不同支付方式的大概流程大抵相似 实现细节有所区别 这个时候就可以用到java的多态机制 先定义一个公共接口 接口定义支付流程的各
  • Windows应急响应篇

    转载至奇安信攻防社区 Windows应急响应篇 Windows应急响应篇 本篇主要以windows下应急响应的基础技术手段进行介绍 一 概述 近年来 随着互联网的发展网络安全攻击事件也是大幅度增多 如何在第一时间发现攻击事件 并实施应急处置
  • 会些java知识,然后要学习spring boot大概需要多长时间?

    Spring boot要学什么 要学到什么程度 以及相关的学习方法是什么 学习spring boot大概需要多长时间 每个人的学习能力 每天能花费时间来学习的时间也是不确定的 这些很难量化 但极好形容 需要学到能帮你找到一份工作的程度 任何
  • 论Java多线程如何引发OOM—多线程开发知识点

    Java ThreadLocal 如何引发 OOM Java 内存泄漏 ThreadLocal OOM 回顾ThreadLocal 强引用 软引用 弱引用 虚引用 Java 内存泄漏 内存溢出 Out Of Memory 是指应用系统中存在
  • 《拉勾Java高薪课程》阶段一输出 之 持久层框架设计实现及MyBatis源码分析-学习笔记 --菜鸟小回

    阶段一模块一学习笔记 文章目录 阶段一模块一学习笔记 toc 一 自定义持久层框架 1 JDBC问题总结 2 问题解决思路 3 自定义框架设计 4 实际项目目录分析 5 优化 5 1 将测试类方法 5 2 仍存在问题 5 3 解决方式 6
  • mybatie+spring+mvc使用反射遇到的问题

    问题1 使用反射调用 serviceImpl时 使用注解的 Dao对象是空 解决办法在 serviceImpl类中 直接去spring容器获取bean 问题2 在一个类TestServiceImple的方法中 使用事务控制 中调用另外一个类
  • STM32F103ZET6【标准库函数开发】------02.2 按键实现短按、长按、双击的效果(非中断方式)

    一 硬件介绍 正点原子战舰开发板 LED0 PB5 LED1 PE5 KEY0 PA4 二 实现目的 开机LED0 LED1均熄灭 单击KEY0 LED0点亮 LED1熄灭 双击KEY0 LED0熄灭 LED1点亮 长按 LED0 LED1
  • Java原生代码连接MySQL数据库

    本章我们介绍 如何用java原生代码实现连接MySQL数据库并实现基本的增 删 改 查操作 为了便于演示 首先我们使用Navicat Premium新建一个user表并添加如下数据 我们需要导入连接MySQL所需要的jar包 jdbc驱动包
  • TCP和UDP的区别和优缺点

    TCP与UDP区别 1连接方式 TCP 面向连接 UDP UDP是无连接的 即发送数据之前不需要建立连接 2提供服务 TCP 可靠的服务 传送的数据 无差错 不丢失 不重复 且按序到达 通过校验和 重传控制 序号标识 滑动窗口 确认应答实现
  • 关于elasticsearch与kibana、IK分词器

    初识elasticsearch 正向索引和倒排索引 什么是文档和词条 每一条数据就是一个文档 对文档中的内容分词 得到的词语就是词条 elasticsearch就是面对文档存储的 可以是数据库中的一条商品数据 一个订单信息 文档数据会被反序
  • groovy语言单元测试(spock)

    一 spock groovy单元测试的五种情况 单元测试 given mock单测中指定mock数据 模拟入参 when 触发行为 比如调用指定方法或函数 then 做出断言表达式 expect 期望的行为 when then的精简版 si
  • java AbstractOwnableSynchronizer与AbstractQueuedSynchronizer简析

    简介 AbstractQueuedSynchronizer全限定名java util concurrent locks AbstractQueuedSynchronizer 继承自java util concurrent locks Abs
  • 掌握了这 7 种 Spring Boot 吞吐量优化解决方案,感觉我又行了

    一 异步执行 实现方式二种 1 使用异步注解 aysnc 启动类 添加 EnableAsync注解 2 JDK 8本身有一个非常好用的Future类 CompletableFuture AllArgsConstructor public c
  • NotePad++安装HEX-Editor插件

    在菜单栏点击插件 插件管理 搜索HEX Editor并打钩 点击安装 然后重新打开notepad 会发现工具栏多了一个H的符号 此时点击H 即可以16进制的形式读取当前文件 还是没有的话建议多试几次
  • SpringBoot整合Druid-Mybatis&SpringSecurity使用

    SpringBoot整合JDBC 创建springBoot项目时首先需要导入JDBC的支持 以及MySQL驱动

随机推荐

  • QT 通信之 QByteArray

    QT上位机的串口通信发送和接收数据都需要用到QByteArray QByteArray存储的是char型字符 但QByteArray提供的数组操作 比char更方便 这篇文章主要讲一下QByteArray在实际应用中的一些函数 以及QBby
  • 机器学习5:评估器estimator

    要定义与tf estimator一起使用的自定义模型 需要使用tf estimator Estimator tf estimator LinearRegressor 线性回归实际上是一个tf estimator Estimator的子类 我
  • ASCII码对照表(十进制和十六进制)

    表 A 1 DEC 多国字符集 十六进制代码 MCS 字符或缩写 DEC 多国字符名 ASCII 控制字符 1 00 NUL 空字符 01 SOH 标题起始 Ctrl A 02 STX 文本起始 Ctrl B
  • CentOS下载ISO镜像的方法

    目录 一 CentOS 介绍 二 进入CentOS 官方网站 三 步骤 一 CentOS 介绍 CentOS 中文意思是社区企业操作系统是Linux发行版之一 是免费的 开源的 可以重新分发的开源操作系统 CentOS Linux发行版是一
  • JDK1.8新特性——lambda表达式和函数式接口

    一 lambda表达式 1 概念 Lambda表达式时一种特殊的匿名内部类 语法更加简洁 Lambda表达式允许把函数作为一个方法的参数 函数作为方法参数传递 将代码像数据一样传递 这里的匿名内部类的理解 我们可以在下述情况中来帮助大家了解
  • 服务器运行多个安卓系统,一台服务器可以做几个云手机

    一台服务器可以做几个云手机 内容精选 换一换 本文介绍使用云手机服务时需要了解的基本概念 云手机是一台包含原生安卓操作系统 具有虚拟手机功能的云服务器 简单来说 云手机 云服务器 Android OS 您可以远程实时控制云手机 实现安卓AP
  • linux 批量解压gz文件夹,linux 批量解压gz bz2文件

    一 批量解压bz2文件 find maxdepth 1 name bz2 xargs i tar xvjf 这条命令可解压当前目录下的所有bz2文件 批量解压是比较郁闷的事 以前尝试各种方法 甚至用脚本循环语句解压都不行 现在发现这条命令可
  • JSON对象转换成Byte(字节)数组

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 如果你不了解JSON对象 请看这里 JSON对象转换成 byte 数组 Byte byteArray Byte jsonData bytes NSLog s byteArr
  • 如何追踪泄漏者信息?软件保护工具VMProtect独有水印快速锁定目标!

    VMProtect是一种很可靠的工具 可以保护应用程序代码免受分析和破解 但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下 才能实现最好的效果 VMProtect提供了一种独特的功能 可以将有关受保护文件所有者的隐
  • 基于Python的微博大数据舆情分析,舆论情感分析可视化系统

    运行效果图 基于Python的微博大数据舆情分析 舆论情感分析可视化系统 系统介绍 微博舆情分析系统 项目后端分爬虫模块 数据分析模块 数据存储模块 业务逻辑模块组成 先后进行了数据获取和筛选存储 对存储后的数据库数据进行提取分析处理等操作
  • LeetCode 541. 反转字符串 II

    题目链接 https leetcode cn problems reverse string ii C 代码如下 class Solution public string reverseStr string s int k int n s
  • vant ui Swipe pc端滑动失效

    这里我使用了vant的Swipe组件 由于vant是移动端的组件库 对pc端会有兼容性问题 例如Swipe 移动端是 touch 该组件做了相应的监听 而PC端是 mouse 没有做对应的监听 因此在pc端无法用鼠标拖动图片 1 安装插件
  • redis BITFIELD详解

    支持子命令和整型 本命令会把Redis字符串当作位数组 并能对变长位宽和任意未字节对齐的指定整型位域进行寻址 下面是已支持的命令列表 GET
  • MYSQL深入学习(一)

    1 mysql 体系结构 连接池组件 管理服务和工具组件 sql接口组件 查询分析器组件 优化器组件 查询缓存组件 插件式存储引擎 mysql的特点 可以根据需求 动态的配置存储引擎 物理文件
  • idea控制台输出中文乱码解决

    解决Intellij IDEA控制台logger info system out println等中文乱码问题 一 编写环境乱码 二 控制台打印乱码 又包含3种 当我们使用Intellij IDEA开发时 首当其冲就是中文乱码问题 造成中文
  • unity物体范围内随机生成

    这个脚本需要挂载到需要随机生成的物体上 但不能是空物体 using System Collections using System Collections Generic using UnityEngine public class Ran
  • CDN回源原理和CDN多级缓存

    一 CDN概念 CDN的全称是Content Delivery Network 即内容分发网络 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节 使内容传输的更快 更稳定 CDN是通过在网络各处放置节点服务器所构成的
  • STL案例——评委打分案例

    有5名选手 选手ABCDE 10个评委分别对每一名选手打分 去除最高分 去除评委中最低分 取消平均分 1 创建五名选手 放到vector中 2 遍历vector容器 取出每一个选手 执行for循环 可以把10个评分打分存到deque容器中
  • Rxjs在Angular中的简单应用

    Angular中集成了Rxjs库 Rxjs是javascript的一个响应式编程库 它提供了很多api 可以很方便的处理和操作应用中的数据 我们在自己的angular项目中新建一个组件 ng generate component rx bu
  • Java多线程两种实现

    在java中实现多线程的方式有两种 一种是继承Thread类 另一个是实现Runnable接口 对于两种实现 各有优缺点 接下来进行对比总结一下 这两种方法 都可以实现多线程 以下为两种实现的写法 继承Thread类的方式 package