并发-开启新线程

目录

实现多线程的官方正确方法:2种

实现Runnable接口方式的实现原理

两种方法的对比

匿名内部类实现线程的两种方式

思考:同时用两种方法会怎么样

总结:最精准的描述


实现多线程的官方正确方法:2种

  • 方法一:实现Runnable接口
  • 声明实现Runnable接口的类,实现Runnable接口中仅有的run方法,然后分配实例对象,在创建Thread时作为一个参数来传递并启动
  • 具体步骤:
  • 1,定义类实现Runnable接口
  • 2,在该类中实现Runnable接口中的run()方法
  • 3,线程中具体要执行的东西写在run()方法中
  • 4,创建Thread类的对象,并在该对象中传入该实现Runnable接口的对象作参数
  • 5,Thread类的对象调用start()方法开启新线程,其内部会自动调用run方法
  • 方法二:继承Thread类
  • Thread类实现了Runnable接口,在java.lang包下
  • 创建执行线程方法二:将类继承Thread类,重写Thread类的run方法
  • 接下来就可以分配并启动该子类的实例
  • 具体步骤:
    • 继承Thread类
    • 重写run方法
    • 将执行的代码写在run方法中
    • 创建Thread类的子类对象
    • 使用start方法开启线程
  • 注意:调用run方法不能开启多线程
  • 只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行
  • 如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码

实现Runnable接口方式的实现原理

  • 1、查看Thread 类的构造函数,传递了Runnable接口的引用,直接调用了init方法
  • 2、追踪init方法,在init方法体中找到了传递的target参数,赋值给了Thread类的Runnable接口的成员变量的target
  • 3、查看run方法时,发现run方法中有判断,如果target不为null就会调用实现Runnable接口子类对象的run方法

两种方法的对比

  • 方法一(实现Runnable接口)更好
  • 继承Thread类是不推荐的,因为它有以下一些缺点:
  • 1-从代码架构角度:具体的任务(run方法)应该和“创建和运行线程的机制(Thread类)”解耦,用runnable对象可以实现解耦
  • 2-使用继承Thread的方式的话,那么每次想创建一个新任务,只能新建一个独立的线程,而这样做的损耗会比较大(比如重头开始创建一个线程,执行完毕以后再销毁等;如果线程的实际工作内容,就是run方法里面只是简单的打印一行字的话,那么可能线程的实际工作内容还不如损耗来的大);如果使用Runnable和线程池,就可以大大减少这样的损耗
  • 3-继承Thread类后,由于Java语言不支持双继承,这样就无法再继承其他的类,限制了可扩展性
  • 两种方法的本质对比
  • 方法一和方法二,也就是“实现Runnable接口并实现run方法”和“继承Thread类然后重写run方法”在实现多线程的本质上并没有区别,最终都是调用了start()方法来启动线程
  • 这两个方法的最主要区别在于run方法的内容来源
  • 方法一:最终调用target.run()
  • 方法二:run()整个都被重写了
  • 源码中的区别:
    • 继承Thread类方式:由于子类重写了Thread类的run(),当调用start()时,直接找子类的run()方法(Java虚拟机自动完成)
    • 实现Runnable方式:构造函数中传入了Runnable的引用,传给了Thread类中的成员变量,start()调用了run()方法时的内部判断成员变量Runnable的引用是否为空,若不为空,编译时看的是Runnable的run(),运行时执行的是具体实现类中的run()
  • 优缺点:
    • 继承Thread类方式
      • 好处:可以直接使用Thread类中的方法,代码简单
      • 弊端:同样也是面向对象中的继承的缺点:如果该具体类已经有了其他的父类,那么就不能多重继承Thread类,就不能使用这种方法;此时面向接口编程的优势脱颖而出
    • 实现Runnable接口方式
      • 好处:即继承的弊端:即使自己定义的线程类有了其他父类也可以实现该Runnable接口;Java中的接口是多实现的,继承是单继承,比较有局限性
      • 弊端:不能直接使用Thread类中的方法,需要先把Runnable具体实现类对象传递给Thread类并获取到线程对象后,才能得到Thread类的方法,代码相对复杂

匿名内部类实现线程的两种方式

  • 即直接使用匿名内部类的方式简化代码:
  • 实现Runnable接口方式:
  • Runnable接口是一个函数式接口,可以直接用Lambda表达式代替
  • 继承Thread类方式:

思考:同时用两种方法会怎么样

  • 示例:
  • 执行结果:
  • 从面向对象的思想去考虑,其实就是Runnable方式run()被实现,但是实现又被Thread方式run()方法给覆盖了,所以只打印了Thread方式run()方法里面的内容

总结:最精准的描述

  • 通常我们可以分为两类,Oracle也是这么说的
  • 准确的讲,创建线程只有一种方式那就是构造Thread类,而实现线程的执行单元有两种方式
  • 方法一:实现Runnable接口的run方法,并把Runnable实例传给Thread类
  • 方法二:重写Thread的run方法(继承Thread类)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/294011.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别 (二)Git(分布式版本控制系统):(二)SVN(集中式版本控制系统)(三)TortoiseGit一、下载安装 git二、安装过程…

[Java基础揉碎]接口

目录 为什么有接口 基本介绍 接口的应用场景 注意事项和细节 接口和继承类的比较 总结 >接口和继承解决的问题不同 >接口比继承更加灵活 >接口在一定程度上实现代码解耦 接口的多态特性 多态参数 ​编辑 多态数组 多态传递 ​编辑 为什么有接口 usb插槽就是…

Educational Codeforces Round 163 (Rated for Div. 2) E. Clique Partition

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

halcon图像腐蚀

1、原理 使用结构元素在图像上移动&#xff0c;只有结构元素上的所有像素点都属于图像中时&#xff0c;才保留结构元素中心点所在的像素&#xff0c;常用于分离连接的两个物体、消除噪声。 2、halcon代码 dev_open_file_dialog (read_image, default, default, Selection) r…

【Java八股面试系列】Arraylist和HashMap的底层原理

文章目录 ArrayList源码总&#xff1a;构造方法扩容机制remove HashMap总&#xff1a;构造方法细节问题putVal()方法resize()方法Hash值 HashMap常见问题 ConcurrentHashMap总&#xff1a;putVal()方法自己的测试 为什么重写HashCode和equals ArrayList源码 总&#xff1a; *…

C++template之类模版进一步了解

目录 一、类模板实例化 1.非类型模版参数 2.函数模板的特化 3.类模板特化 3.1全特化 3.2偏特化 3.2.1部分特化 3.2.2对参数进一步限制 二、注意事项 1.类模板的定义和声明要在同一个文件&#xff0c;不然容易出错 前言&#xff1a;这一篇是在我的上一篇文章的基础上&am…

网络安全接入认证-802.1X接入说明

介绍 802.1X是一个网络访问控制协议&#xff0c;它可以通过认证和授权来控制网络访问。它的基本原理是在网络交换机和认证服务器之间建立一个安全的通道&#xff0c;并要求客户端提供身份验证凭据。如果客户端提供的凭据是有效的&#xff0c;交换机将开启端口并允许访问。否则&…

“转行做程序员”很难?这里有4个建议

近几年来&#xff0c;传统行业多处于经济下行&#xff0c;加上互联网行业的赚钱效应&#xff0c;想要转行到这一行的人越来越多&#xff0c;其中程序员这个行业更是很多人梦寐以求的。 但另一方面&#xff0c;我们也发现&#xff0c;这些想要转行的同学们往往会遇到很多困扰。…

使用Kaggle API快速下载Kaggle数据集

前言 在使用Kaggle网站下载数据集时&#xff0c;直接在网页上点击下载可能会很慢&#xff0c;甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包&#xff1a; pip install…

linux bypy 定时备份到百度网盘

安装 # 先卸载安装的python-pip sudo yum remove python-pip# 下载get-pip.py文件 wget https://bootstrap.pypa.io/pip/2.7/get-pip.py sudo python get-pip.py直接访问这个地址下载文件,再导入linux更快! https://bootstrap.pypa.io/pip/2.7/get-pip.py 连接 复制上面的连…

Prometheus+grafana环境搭建mysql(docker+二进制两种方式安装)(三)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前两篇 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 1.监控mysql 1.1官方地址:…

Unity TrailRenderer的基本了解

在Unity中&#xff0c;TrailRenderer组件用于在对象移动时创建轨迹效果。通常用于增强游戏中的动态物体&#xff0c;比如子弹、飞行道具或者角色移动时的拖尾效果。 下面来了解下它的基本信息。 1、创建 法1&#xff1a;通过代码创建 using UnityEngine;public class Trail…

linux系统命令chkconfig详解,管理系统服务的工具-查看、启用、禁用和设置系统服务的启动级别

目录 一、chkconfig命令介绍 二、命令的主要作用 1、管理服务的启动和停止&#xff1a; 2、配置运行级别&#xff1a; 3、简化系统管理&#xff1a; 4、查看服务状态&#xff1a; 三、命令语法 1、基本语法 2、运行级别 四、获取帮助 1、通过help获取 2、通过man获…

Eclipse+Java+Swing实现斗地主游戏

一. 视频演示效果 java斗地主源码演示 ​ 二.项目结构 代码十分简洁&#xff0c;只有简单的7个类&#xff0c;实现了人机对战 素材为若干的gif图片 三.项目实现 启动类为Main类&#xff0c;继承之JFrame&#xff0c;JFrame 是 Java Swing 库中的一个类&#xff0c;用于创建窗…

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(8)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之云原生架构设计理论与实践&#xff08;7&#xff09; 所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第2节 云原生架构内涵 14.2 云原生架构内涵 关于云原生的定义有众多版本&#xff0c;对于云原生架构的…

Java学习之类和对象、内存底层

目录 表格结构和类结构 表格的动作和类的方法 与面向过程的区别 具体实现 对象和类的详解 类的定义 属性&#xff08;field 成员变量&#xff09; 方法 示例--编写简单的学生类 简单内存分析(理解面向对象) 构造方法(构造器 constructor) 声明格式&#xff1a; 四…

探索父进程和子进程

文章目录 通过系统调用查看进程PID父进程、子进程 通过系统调用创建进程-fork初识为什么fork给父进程返回子进程的PID&#xff0c;给子进程返回0fork函数如何做到返回两个值一个变量为什么同时会有两个返回值&#xff1f;bash总结 通过系统调用查看进程PID getpid()函数可以获…

大屏可视化项目示例--基于Vue3+vite2+echart+mock+axios+dataV

图例&#xff1a; 项目环境&#xff1a; Vite、Echarts、Npm、Node、axios、mock、vue3、dataV。 项目地址&#xff1a; IofTV-Screen-Vue3: &#x1f525;(IofTV-Screen Vue3版本)一个基于 vue3、vite、Echart 框架的物联网可视化&#xff08;大屏展示&#xff09;模板&…

多尺度变换(Multidimensional Scaling ,MDS)详解

一、基本思想 MDS&#xff08;Multidimensional Scaling &#xff0c;MDS多维尺度变换&#xff09;是一种经典的降维算法&#xff0c;其基本思想是通过保持数据点之间的距离关系&#xff0c;将高维数据映射到低维空间中。 具体来说&#xff0c;MDS算法的基本步骤如下&#xff…

Cocos2dx-lua ScrollView[三]高级篇

一.概述 本文缩写说明&#xff1a;sv ScrollView, cell代表ScrollView的一个子节点 本文介绍sv的一种封装类库&#xff0c;来实现快速创建sv&#xff0c;有如下几个优点&#xff1a; 1.item的位置通过参数控制&#xff0c;提高开发效率 2.免去了调用sv的API&#xff0c;提…