黑马程序员——多线程笔记

2023-11-11

------- <a target=_blank target="_blank" href="http://www.itheima.com">android培训</a>、<a target=_blank target="_blank" href="http://www.itheima.com">java培训</a>、期待与您交流! ----------

多线程

一、概念

进程:正在运行中的程序。一般在任务管理器中可以看到有很多正在执行的程序。CPU在快速的切换执行这些进程,CPU在一个时刻只执行一个进程

线程:就是进程中的独立控制单元,控制程序的运行。一个进程肯定至少有一个线程,当线程执行完后,这个进程(程序)也就执行完了

多线程:就是一个进程里面有两个以上的线程同时在运行,其中有一个主线程,其他的线程辅助主线程共同完成程序的执行。当主线程执行的时候,其它线程可以处理如网络访问,垃圾回收等这些事情,使程序工作更快

多线程是cpu在几个线程之间切换,速度非常快,所以我们感觉程序是同时运行的,其实不是,在一个时刻CPU只运行一个线程(这是单核情况,多核除外)

为什么要覆写run方法?

因为定义的线程类就用来存储线程运行的代码,该储存功能就是run方法,就像主线程要运行的方法要存在main方法里面一样,由虚拟机调用main

 

二、线程创建的2种方法

1、  继承Thread类创建线程,并覆写run方法

步骤:【1】创建线程,并覆写run方法

class TestThreadextends Thread{

   @Override

   public void run() {

      System.out.println("线程运行");

   }

}

【2】调用线程的start方法,开启线程,并让jvm调用run方法

TestThread t=new TestThread();

    t.start();

如果用t.run();来运行,则只有一个线程,主线程,和普通的对象调用方法一样,线程并没有开启,必须要用start()方法才能开启线程

   2、实现Runnable接口
      步骤:【1】定义类实现Runnable接口

            【2】覆写Runnable的run方法
            【3】通过Thread类建立线程对象

            【4】把Runnable接口的自雷对象传递该线程的构造函数

            【5】调用线程对象的start方法开启线程

三、线程的几种状态

1、  创建

2、  运行

3、  冻结
冻结分为:休眠(sleep)和等待(wait())。调用这两个方法的话,表示放弃了CPU的执行权,被唤醒了之后,则回到阻塞状态
如果调用wait()方法,则必须用notify()来唤醒线程

4、  销毁:调用stop方法,或者代码运行完

5、  阻塞:在等待CPU的执行权。具备运行资格,但没有执行权

四、获取线程的名称

线程对象可以调用getClass()来获取线程的名称。线程也可以自定义名称,通过传递名称的构造函数可以指定线程名称,也可以用setname()来设置
用Thread.currentThread()可以获取当前线程的名称,是静态的方法。

五、实现方式和继承方式的区别?

实现方式:避免了单继承的局限性,建议一般采用实现方式
继承方式:线程的代码房子Thread子类方法中,实现方式代码存放在接口的子类中

六、线程的安全问题

问题的原因:
    当多条语句操作一个线程共享数据时,一个线程对多条语句执行了一部分,还没执行完,另一个线程参与进来,导致了共享数据的错误。
解决办法:
    对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其它线程不可以参与进来。通过同步代码块可以解决这个问题
synchronized(对象){
需要被同步的代码
}
即,在会产生安全问题的代码块,用synchronized进行同步,在一个时刻只有一个线程在里面执行,所以不会产生安全问题,不会把共享数据弄错
同步的前提:必须有两个以上的线程,必须是多个线程使用同一个代码块,但是同步之后会消耗一些资源,性能有一点影响

七、         同步函数

把synchronized做为修饰符修饰函数,那么这个函数就具备了同步的功能,同步函数传递的参数对象用的是同一个对象(锁)this,这样才会同步成功

八、静态函数的锁

静态进内存时,内存中没有本类对象,但是一定有字节码文件对象,类名.class,该对象类型是Class

synchronized(Demo.class){}

九、单例设计模式

懒汉式和恶汉式。懒汉式在加载的时候会产生线程安全问题,可以通过同步来解决这个问题,加同步的方式可以用双重判断来解决,使用的锁是该类所属的字节码对象

延迟加载的单例设计模式

如下:

public static SinglegetInstance(){

      if(s==null){

         synchronized (Single.class) {

            if(s==null)

                s=newSingle();

         }

      }

      returns;

   }

十、死锁

同步中嵌套同步,但是锁不同,一定要会写死锁


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

黑马程序员——多线程笔记 的相关文章

  • Hashmap并发问题

    我有一个哈希图 出于速度原因 我希望不需要锁定 假设我不介意过时的数据 同时更新它和访问它会导致任何问题吗 我的访问是获取 而不是迭代 删除是更新的一部分 是的 这会导致重大问题 一个例子是向散列映射添加值时可能发生的情况 这可能会导致表重
  • 在Java中使用命令行编译多个包

    您好 我一直在使用 IDE 但现在我需要从命令行运行和编译 问题是我有多个软件包 我试图找到答案 但没有任何效果 所以我有 src Support java files Me java files Wrapers java files 你知
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 防止 Spring Boot 注册 Spring Security 过滤器之一

    我想禁用安全链中的 Spring Security 过滤器之一 我已经看到了防止 Spring Boot 注册 servlet 过滤器 https stackoverflow com questions 28421966 prevent s
  • 使用 Java 在 WebDriver 中按 Ctrl+F5 刷新浏览器

    我已经使用 java 刷新了 WebDriver 中的浏览器 代码如下 driver navigate refresh 如何使用 Java 在 WebDriver 中按 Ctrl F5 来做到这一点 我认为您可以使用 WebDriver 和
  • URL.setURLStreamHandlerFactory

    我正在使用带有嵌入式 Jetty 的可执行 jar 开发一个 Web 应用程序 我的jar包含一个依赖jar jar in jar 我参考了JarRsrcLoader and RsrcURLStreamHandlerFactory由 Ecl
  • 如何拦截 REST 端点以接收所有标头?

    我当前的代码是 Path login RequestScoped public class LoginResource GET SecurityChecked public Response getUser HeaderParam AUTH
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • 线程“main”中的异常 java.lang.StackOverflowError

    我有一段代码 但我无法弄清楚为什么它在线程 main java lang StackOverflowError 中给出异常 这是问题 Given a positive integer n prints out the sum of the
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 发生错误。请参阅日志文件 - eclipse juno

    每当我启动 Eclipse Juno 时 都会出现错误 发生错误 请查看日志文件 C Program Files eclipse configuration 1362989254411 log 有的网站说卸载jdk重新安装 我这样做了 但没
  • JSch中如何设置文件类型和文件传输模式?

    我使用 Apache Common NetFTPClient并设置了我的ftpClient在上传文件之前使用如下所示的方法 ftpClient setFileType FTP BINARY FILE TYPE ftpClient setFi
  • 使用 secp256r1 曲线和 SHA256 算法生成 ECDSA 签名 - BouncyCastle

    我正在尝试使用带有 secp256r1 曲线 P256 的 ECDSA 和用于消息哈希的 SHA256 算法生成签名 我也在使用 Bouncy Castle 库 下面的代码 public class MyTest param args pu
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 如何用表达式语言获取布尔属性?

    如果我有一堂这样的课 class Person private int age public int getAge return age public boolean isAdult return age gt 19 我可以得到age像这样
  • 春季 CORS。在允许的来源中添加模式

    查看CORS的弹簧指南 以下代码启用所有允许的来源 public class MyWebMVCConfigurer extends WebMvcConfigurerAdapter Override public void addCorsMa
  • 摩尔斯电码 至 英语

    我现在的问题是让 摩尔斯电码转英语 正常工作 将英语转换为莫尔斯电码的第一部分工作正常 我知道以前已经有人问过这个问题 但我不知道我做错了什么 我知道我需要在某个地方进行拆分 但我只是不确定将其放在代码中的何处 现在 莫尔斯电码到英语的部分
  • 如何在不同版本的Google App Engine中使用自定义域名?

    我使用谷歌应用程序引擎作为我的 Android 和 Web 应用程序的服务器 我使用 Android Studio 开发了 Android 应用程序 并使用 Eclipse 开发了 Web 应用程序 我在应用程序引擎中部署了两个版本 第一个
  • 如何捕获 try-with-resource 语句中 close 方法抛出的异常

    我正在读关于try with resourceJava 中的语句可用于指定任意数量的资源 try Resource1 res1 initialize code Resource1 res2 initialize code statement

随机推荐

  • 机器学习之KNN检测恶意流量

    背景 任何智能活动的都可以称为人工智能 而机器学习 Machine Learning 属于人工智能的一个分支 深度学习 Deep Learning 则是机器学习的分支 近年来 随着基础设施的完善 海量大数据的积累 机器学习方法理论越来越成熟
  • uniapp icon标签

  • 使用Clang编译内联intel语法汇编的C/C++项目

    我们在编写C C 代码时 如果在有较高性能需求的时候 可以使用汇编代码来编写相应的函数 C C 直接调用即可 汇编的语法格式有两种 一种是我们在Windows下常见的Intel的语法格式 另一种是GCC下使用的AT T格式的语法 这种语法对
  • MAC上Chrome关闭黑暗模式

    方法 1 打开 Chrome 或基于 Chromium 的浏览器 2 在URL处输入 chrome flags enable force dark 确保 Force Dark Mode for Web Contents 和 Web Plat
  • pandas的引入及Series的基础操作、读取外部文件

    作用 相对于numpy pandas更进一步能帮助处理数值型数据之外的其他类型数据 比如时间序列 字符串等 常用数据类型 Series 一维 带标签数组 DataFrame 二维 Series容器 Series 创建Series数组 语法结
  • 【实用工具】利用MyBatisX插件自动生成代码

    文章目录 1 概述 2 基本使用 2 1 插件安装 2 2 集成数据库 1 概述 MybatisX 是一款基于 IDEA 的快速开发插件 为效率而生 在开发过程中 相信大家都遇到过一个数据库内有着十几张或比之更多的数据表的情况 而面对这众多
  • PHP基础

    php语法初步 php是一种运行在服务器端的脚本语言 可以嵌入到html中 php代码标记 在PHP历史发展中 可以用多种标记来区分php脚本 asp标记 短标记 以上两种基本弃用 如果要使用那么需要在配置文件中开启 脚本标记
  • Jenkins 简介

    Jenkins 简介 为什么要使用 Jenkins 是 Jenkins 还是 Hudson 从 Hudson 到 Jenkins 一个简短的故事 应该使用 Jenkins 还是 Hudson Jenkins 简介 Jenkins 最开始被称
  • failed to accept an incoming connection: connection from 127.0.0.1

    一 报错详细信息 root host 47 98 97 124 tail f tmp zabbix agentd log 11822 20180707 094214 749 Starting Zabbix Agent host 47 98
  • [javascript] Box2D JS初探(一个控制小球的游戏例子)。学习用!

    Box2D 开源物理引擎 第一次接触 主要用途应该是做游戏 不过也可以作些简单的页面特性 比如切割粉碎 拖动带弹性系数 从写了个控制小球运动 可以方向键控制左右和弹跳 碰到障碍物就死掉的DEMO来试试 演示地址 null 这里注意的是 市面
  • 在树莓派和Ubuntu等Linux发行版平台上使用OpenCV原生API调用摄像头等设备时虚拟机崩溃的问题及解决方案

    在树莓派和Ubuntu等Linux发行版平台上使用OpenCV原生API调用摄像头等设备时虚拟机崩溃的问题及解决方案 摘要 本文讨论了在树莓派和Ubuntu等Linux发行版平台上使用OpenCV原生API调用摄像头等设备时可能导致虚拟机崩
  • Quartus II 13.1的安装及使用

    文章目录 一 下载安装注册 二 设计D触发器 2 1 新建工程 2 2 创建原理图和VWF文件 2 3 时序波形仿真 三 调用D触发器 3 1 新建工程 3 2 创建原理图和VWF文件 3 3 波形仿真 四 用Verilog语言写D触发器
  • vue预览tiff格式文件

    vue 预览tiff格式的文件 1 下载tiff js tiff js官网 npm 安装 npm i tiff js S yarn 安装 yarn add tiff js S 安装完成之后通过 img 标签使用即可 div fileInfo
  • 数据结构:手撕图解二叉树(含大量递归图解)

    文章目录 写在前面 二叉树的创建 二叉树的遍历 前序遍历 中序遍历 后序遍历 层序遍历 二叉树的销毁 二叉树节点个数 二叉树叶子节点的个数 二叉树查找值为x的节点 二叉树是否为完全二叉树 写在前面 二叉树的几乎所有实现都是依靠递归实现 递归
  • 51单片机:独立按键控制数码管计数

    按键动作的前沿和后沿会都有大约10ms的抖动 人在按下按键到松开至少需要50ms以上 待考证 此代码实现的功能为给按键计数 并给按键消抖 欢迎邮箱交流 bglei foxmail com 作者 CHNfisher include
  • JS压缩图片

    作者 wuwhs https segmentfault com a 1190000023486410 说明 js image compressor 是一个实现轻量级图片压缩的 javascript 库 压缩后仅有 5kb 在前端页面即可实现
  • 【数据挖掘】特征化分析(信息增益)

    目录 前言 数据预处理 导入库 读取样本数据 计算过程 计算每个属性的熵 计算给定的样本分类所需要的期望信息 计算所有属性的信息增益 结果可视化 信息增益较大的属性下的结果 信息增益较小的属性下的结果 写在后面 前言 这是一个数据挖掘选修课
  • ubuntu系统中新建文件的默认权限

    在ubuntu系统中 当我们使用touch 和 mkdir 新建文件和目录时 并没有指明要赋予它们的权限 在man的帮助手册中也没有找到相应选项 虽然后续我们可以使用chmod 修改文件的权限 但是清楚新建文件的默认权限的来源是十分有必要的
  • 根据采购订单IDN进行MIGO过账的BAPI逻辑

    客户需求 根据ALV上的采购订单IDN进行过账 如果有IDN 就根据IDN过账 如果没有 就根据采购订单过账 BAPI ITEM数据填充如下 DATA ls goodsmvt item TYPE bapi2017 gm item creat
  • 黑马程序员——多线程笔记

    a target blank href http www itheima com android培训 a a target blank href http www itheima com java培训 a 期待与您交流 多线程 一 概念 进