04747 java程序设计笔记 --多线程

2023-05-16

在这里插入图片描述

文字篇

线程概念

  • 进程

    • 程序在处理机的一次运行,(从代码加载,执行至完毕的一个完成过程)
  • 线程

    • 进程执行过程中产生的多条执行线索,比进程单位更小的执行单位。
    • 它没有出口,没有入口,因此自身不能自动运行,而必须栖身于某一进程之中,有进程触发执行。
  • 多线程

    • java语言把线程或执行环境当作一个封装对象,包含CPU以及自己的程序代码和数据,由虚拟机提供控制。
    • Thread类,创建多线程

线程结构

  • 虚拟CPU

    • 控制整个线程的运行
  • 执行的代码

    • 由Thread类控制按序执行
  • 处理的数据

    • 是在代码执行过程中索要处理的数据。

线程的状态

  • 新建

    • new Thread()
  • 可运行

    • 已经执行start()方法后,可使线程处在可运行状态
    • 可运行但没在运行的线程都排在一个队列中,这个队列是就绪队列,
    • 可运行状态中,正在运行的线程处于运行状态,等待运行的线程处于就绪状态。
  • 死亡

    • 当run()方法中最后一个语句执行完毕,及死亡
    • 当线程遇到异常退出时便进入了死亡状态
  • 阻塞

    • 阻塞时线程不能进入就绪队列排队,必须要等到消除阻塞才可以重新进入队列排队
    • sleep() wait()是两个常用的引起阻塞的方法
  • 中断线程

    • interrupt()来终止线程,可终止处于阻塞状态或者正在运行的线程

    • 测试线程是否被中中断的方法

      • void interrupt()

        • 向一个线程发送一个中断请求,同时把这个线程的interrupted状态设置为true,若该线程处于blocked状态,会抛出InterruptedException异常
      • static boolean interrupted()

        • 检测当前线程是否已被中断,并充值状态 interrupted值,如果连续两次调用该方法,则第二次调用将返回false
      • boolean isInterrupted()

        • 检测当前线程是否已被中断,不改变状态 interrupted 值

创建线程

继承Thread类创建

  • 步骤

    • 从Thread类派生一个子类,在类中一定要实现run()
    • 用该类创建一个对象。
    • 用start()方法启动线程。

实现Runnable接口创建

  • 创建一个实现Runnable()接口的类
  • 用该类创建对象
  • 用start()方法启动线程

创建线程两种方法的使用条件

  • 使用Runnable接口方法情况

    • 需要多继承的情况
  • Thread方法情况

    • 单继承
    • 简单不繁琐

线程的基本控制

线程启动

  • start()

    • 启动线程对象,让线程从创建状态转为就绪状态
  • run()

    • 用来定义线程对象被调度后所执行的操作,用户必须重写run()方法
  • yield()

    • 强制终止线程执行
  • isAlive()

    • 测试当前线程是否在活动
  • sleep(int millsecond)

    • 使线程休眠一段时间,试驾你长短由millsecond决定,单位为ms
  • void wait()

    • 是现成处于等待状态

线程调度

  • 定义

    • 调度通常是抢占式,抢占式调度是值可能由多个线程准备运行,但是只有一个在真正运行
  • 优先级

    • 优先级高的先执行

      • MAX_PRIORITY = 10(最高)
      • MAX_PRIOPITY = 1 (最低)
      • MAX_PRIOPITY = 5 (默认)
    • 每个线程创建时都会被自动分配一个优先级,默认时,继承其父类优先级

    • 任务紧急的线程,其优先级较高

    • 同优先级的线程 先进先出 原则

  • 方法

    • setPriority(int newPriority)

      • 重置线程优先级
    • int getPriority()

      • 获得当前线程的优先级
    • static void yield()

      • 暂停当前正在执行的线程,让当前线程放弃执行权

线程结束

  • 自然死亡

    • run()方法执行到最后一行
  • 强迫死亡

    • interrupt()方法中断线程执行

线程挂起

  • 暂停一个线程 也称挂起

  • 方法

    • sleep()

    • wait() / notify() / notifyAll()

      • wait()方法导致当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法唤醒
    • join()

      • 将引起线行线程等待,直至join()方法 调用的线程结束

线程互斥

何为互斥

  • 同时运行的数据需要共享数据,如何保证共享数据的一致性

对象的锁定标志

  • 目的

    • 互斥锁来解决不同线程对共享数据操作的同步
  • 实现互斥锁

    • 用volatile关键词声明一个共享变量
    • 用Synchronized来声明操作共享数据的一个方法或一段代码

线程同步

同步问题

  • 生产者比消费者快,消费者会漏掉一些数据没有取到
  • 消费者比生产者快时,消费者取相同的数据

解决问题

  • 第一用来排列等待锁定标志的线程

  • 第二用来实现wait()和notify()的交互机制

    • wait()作用时让当前线程释放其所持有的对象互斥锁,进入wait队列

      • wait()方法只能在被声明的synchronized的方法或代码段中调用。
    • notify()/notifyAll()的作用时唤醒一个或所有正在等待队列中等待的线程,并将它们移入等待同一个对象互斥锁队列

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

04747 java程序设计笔记 --多线程 的相关文章

  • firewalld高级配置

    1 IP地址伪装 masquerade xff1a 伪装 通过地址伪装 xff0c NAT设备将经过设备的包转发到指定接收方 xff0c 同时将通过的数据包的原地址更改为NAT的接口地址转发到不同步目的地 当是返回数据包是 xff0c 会将
  • Java中关于JSON格式数据的操作

    对于java格式数据的处理 xff1a 1 xff1a 先创建java实体类 xff0c 例如 xff1a public class Brand private String id private String brandName publ
  • 线程常用调度方法

    目录 一 线程等待 二 线程通知 三 线程休眠 四 请求让出CPU执行权 五 线程中断 一 线程等待 1 wait xff08 xff09 xff1a 当一个线程调用了wait xff08 xff09 方法后 xff0c 这个线程会被阻塞挂
  • centos7 安装jdk详细教程

    一 前言 本文主要介绍的是Centos7 Linux环境下安装jdk 8u333的详细图文教程 xff0c 用过linux服务器的开发人员都知道 xff0c JDK是作为日常开发常用的基础环境 xff0c 所以安装jdk是必要的 xff0c
  • KDE 美化(Manjaro)-记录

    KDE 美化 Manjaro 要想在不同的工具包之间获得相似的外观 xff0c 你很可能需要修改以下内容 xff1a 主题 包含一套风格 图标主题和颜色主题 风格 图形布置 xff0c 观感 图标主题 一套整体的图标 颜色主题 一套连接风格
  • spring容器对Bean组件的管理

    spring容器对Bean组件的管理 1 Bean对象创建时机 默认是随着容器创建 xff0c 可以使用lazy init 61 true xff08 在调用getBean创建 xff09 延迟创建 xff0c 也可以使用 lt beans
  • nginx平滑升级(添加echo功能)配置和状态监控

    添加echo模块 配置 1 先去github或者gitee中找到nginx module echo master zip包 2 将原来的ngin 1 20 1删除 重新编译安装 span class token punctuation sp
  • 字节对齐的原理和方法

    Pragma是什么 小发猫的博客 CSDN博客 pragma是什么 Pragma是什么 Pragma是什么 翻译 SkyJacker后附英文原文 译者注 一句话 xff0c pragma就是为了让编译器编译出的C或C 43 43 程序与机器
  • 【Android】Banner2.1的使用

    com youth banner Banner 2 1的使用 与前版本不同的是 xff0c 2 1版本是用的适配器 设置适配器和点击事件 banner span class token punctuation span span class
  • linux系统中安装Java环境

    Ubuntu安装Java环境 步骤1 xff1a 下载jdk 我选择的jdk版本文件 xff1a jdk 8u131 linux x64 tar gz 步骤2 xff1a 创建单独的目录 sudo mkdir usr local java
  • SpringMVC --01.2023Idea搭建全注解式开发的SpringMVC

    1 创建项目 打开Idea xff0c 并点击新建项目 注 xff1a 使用的是2022 2的商业版 xff0c 该版本跟2021 2的商业版创建Maven项目不一样 点击右侧的新建项目 gt 取名 gt 创建 这样我们就创建了一个空依赖的
  • Java中的异常及异常处理

    目录 1 什么是异常 2 为什么要处理异常 3 异常分类 4 如何进行异常处理 4 1 捕获异常 4 2 手动抛出异常 4 3 自定义异常 4 4 debug调试模式 5 其他异常 1 什么是异常 程序中 在代码编译或运行过程中 xff0c
  • Spring之配置文件

    目录 什么是配置文件 配置文件作用 配置文件的格式 properties 配置文件说明 properties 基本语法 三种读取properties的方法 yml 配置文件 yml 基本语法 总结 什么是配置文件 首先我们知道我们的程序是
  • 已解决:前、后端打包部署至服务器后,背景图片不显示并且一些图标都变成了方块

    将打包好的jar包部署至服务器后 xff0c 输入项目网址后 xff0c 发现背景图片没有显示出来并且一些图标变成了方块 解决办法 xff1a 在前端找到bulid文件目录下的utils js文件 xff0c 添加以下语句 xff1a pu
  • 分布式 Redis & RabbitMQ 终极秒杀

    本篇文章记录的为RabbitMQ知识中企业级项目中秒杀相关内容 xff0c 适合在学Java的小白 帮助新手快速上手 也适合复习中 xff0c 面试中的大佬 x1f649 x1f649 x1f649 如果文章有什么需要改进的地方还请大佬不吝
  • Ubuntu字符界面输入密码始终提示错误 login incorrect 解决办法

    首先要明确自己的用户名 xff0c 可以在设置中看到 其次是密码 xff1a 如果密码有数字 xff0c 只能使用字母上面的数字输入 xff0c 数字键盘无法识别 xff0c 会导致login incorrect
  • Unix环境高级编程代码(实时更新)

    实例1 3 列出一个目录中所有文件 xff08 ls c xff09 include 34 apue h 34 include lt dirent h gt int main int argc char argv DIR dp struct
  • nginx-rewrite和if使用

    rewrite 常见的flag flag作用last基本上都用这个flag xff0c 表示当前的匹配结束 xff0c 继续下一个匹配 xff0c 最多匹配10个到20个 一旦此rewrite规则重写完成后 xff0c 就不再被后面其它的r
  • ZYNQ7020 FPGA 如何生成从Flash和SD卡启动的镜像文件

    ZYNQ7020 FPGA 生成从Flash和SD卡启动的镜像文件 xff08 BOOT bin xff09 创建BOOT bin 工具vivado 2017 4 1 创建工程 包括创建工程 xff0c 编写程序 xff0c 添加约束 2
  • 解析Android自带的SettingActivity——>Proference

    1 在res xml中 的代码解析 Preference是采用SharedPreference保存数据的 这里的属性key表示默认存储的键 xff0c defaultValue表示默认存储的值 如果是使用preference的话 xff0c

随机推荐

  • Android中使用lottie资源

    lottie资源的使用 1 下载lottie文件的网址 xff1a https lottiefiles com xff0c 下载的文件为 json的文件 2 存放在Android的位置为 3 在应用级别的 build gradle 文件中添
  • 【实验七】Linux生产者消费者问题(线程)

    目录 一 问题介绍 二 代码 1 prod cons cpp 2 producer h 3 producer cpp 4 consumer h 5 consumer cpp 6 mq h 7 mq cpp 8 message h 9 mes
  • HTTP-响应数据格式及常见地状态响应码(403,404,405)

    HTTP 响应数据格式 响应数据分为3部分 1 响应行 响应数据的第一行 其中HTTP 1 1表示协议版本 xff0c 200表示响应状态码 xff0c OK表示状态码描述 2 响应头 第二行开始 xff0c 格式为键值对的形式 3 响应体
  • 【Linux】TigerVNC安装指导

    1 以单一用户远程访问桌面 1 1 服务端中启用桌面共享 在统信服务器操作系统V20 1020a 上配置为启用单一客户端的远程桌面连接 1 2 配置远程桌面服务端 1 配置防火墙规则来启用对服务端的VNC访问或关闭防火墙 xff1a fir
  • 使用console.log输出特殊字符图案或自定义图片

    最近看到一篇比较有趣的文章 程序员的浪漫 console log 在浏览器控制台输出特殊字符编码的图案 想自己动手试一试 xff0c 很明显我做的效果不好 xff0c 弄了很久还是没弄出来 下面介绍另外一种方法 xff0c 方法来自 使用c
  • IDEA中添加了vue.js插件后setting就打不开;添加vue.js报错Requires plugin ‘intellij.webpack‘ to be installed

    IDEA版本要和vue js版本对应 查看IDEA版本 xff0c help about 然后再去官网查找和自己IDEA版本对应的vue js Versions Vue js IntelliJ IDEs Plugin Marketplace
  • yml配置文件简单语法及小坑

    yml文件使用方法 1 语法 K 空格 V 表示一对键值对 xff0c 以空格缩进来控制层级关系 xff0c 只要左对齐的一列数据 xff0c 都是一个层级的 属性和值是大小写敏感 2 写法 普通值 字符串默认不加单引号或者双引号 xff1
  • 抽象工厂模式

    工厂模式 工厂方法模式 xff08 Fatory Method Pattern xff09 提供一个接口 xff0c 一个可创建一系列相关对象的 无需指定他们的具体类 一个抽象工厂类 xff0c 不同的具体工厂产生不同的对象实体 eg 冰箱
  • docker简介--01

    官方文档 xff1a https docs docker com engine reference commandline docker 官方仓库 xff1a https hub docker com docker基本组成 image 镜像
  • docker网络配置和名称空间管理

    docker容器虚拟化 虚拟化网络 Network Namespace 是 Linux 内核提供的功能 xff0c 是实现网络虚拟化的重要功能 xff0c 它能创建多个隔离的网络空间 xff0c 它们有独自网络栈信息 不管是虚拟机还是容器
  • CentOS系统下安装docker简易步骤

    docker 官网地址 https www docker com docker 开发文档 https docs docker com manuals 手册 gt install gt Linux xff08 centos xff09 环境为
  • linux环境安装jdk

    linux环境安装jdk 1 查看本环境下是否java环境 java version 不存在 已存在 2 如果不存在 xff0c 先去下载jdk 到官网下载jdk 注 xff1a 一定要根据具体的linux系统按需下载对应的安装包 我的是l
  • linux环境下安装tomcat

    配置tomcat 到官网下载tar包 将tar包上传到服务器 并解压 span class token function tar span zxvf apache tomcat 9 0 65 tar gz 重命名tomcat9 span c
  • docker基础命令以及常用命令

    docker 基本命令 1 其他命令 span class token comment 查看版本 span docker version span class token comment 查看信息 span docker info span
  • Redis基础数据结构及其使用

    Redis 一 xff0c docker方式安装redis span class token comment 拉取 redis 镜像 span span class token operator gt span span class tok
  • 设计模式之--原型模式

    原型模式 原型实例指定创建对象的种类 xff0c 并且通过复制这些原型创建新对象 使用场景 xff1a 类初始化消耗资源比较多 使用new生成一个对象需要非常繁琐的过程 构造函数比较复杂 在循环体中产生大量对象 浅克隆 浅克隆只是完整复制了
  • redis分布式锁使用方式

    为什么使用锁 xff1f 锁的作用是要解决多线程对共享资源的访问而产生的线程安全问题 当多个线程并发操作某个对象时 xff0c 可以通过synchronized来保证同一时刻只能有一个线程获取到对象锁进而处理synchronized关键字修
  • Redis的延时队列

    延时队列 redis的list数据结构用来做一部消息队列 xff0c 使用rpush lpush操作入队列 使用lpop rpop来出队列 span class token operator gt span rpush notify que
  • 设计模式---代理模式

    代理模式 proxy pattern 定义 xff1a 指为其他对象提供一种代理 xff0c 以控制对这个对象的访问 代理对象在客户端和目标对象之间起到中介作用 使用目的 保护目标对象增强目标对象 解释 Subject是顶层接口 xff0c
  • 04747 java程序设计笔记 --多线程

    文字篇 线程概念 进程 程序在处理机的一次运行 xff0c xff08 从代码加载 xff0c 执行至完毕的一个完成过程 xff09 线程 进程执行过程中产生的多条执行线索 xff0c 比进程单位更小的执行单位 它没有出口 xff0c 没有