java多线程-Thead线程学习记录笔记

2023-11-03

介绍的内容:

主要介绍多线程的基本概念到后面的基本使用。以及一些稍微的原理猜测。个人笔记,不喜勿喷 

目录

目录

一、线程使用

1.1 概念

1.2 线程生命周期

1.3 java中实现的方式

  1.3.1 继承线程 Thread

1.3.2 实现接口Runnable (无返回值)

1.3.3 实现接口Callable (带返回值)

1.4线程执行的流程

二、多线程带来的安全性问题

三、如何解决安全性问题

3.1 基本概念

3.2 如何自己实现上锁操作

四、线程相关使用工具

4.1相关同步API(了解)

4.2线程池相关的知识点(掌握)

 4.2.1 ThreadPoolExecutor相关参数

 4.2.2 线程池提供静态创建

4.2.3猜想一下线程池的实现原理

4.2.4其他


一、线程使用

线程:主要是异步+并行,为了合理的利用cpu资源

 一般多线程都会和并发、并行联系在一起。

1.1 概念

 并发:单个时间内,能支持的吞吐量。一定需要多线程的参与, 常见的评判指标有:QPS,TPS来进行评判标准

 并行:同一时刻能够运行多个任务

1.2 线程生命周期

图:

            

 

  1. 新建NEW、
  2. 运行RUNNABLE(就绪-->通过cpu调用算法)
  3. 阻塞BLOCKED、
  4. 等待WAITING、
  5. 超时等待TIMED_WAITING、
  6. 终止 TERMINATED

1.3 java中实现的方式

  1.3.1 继承线程 Thread

 // 方式一 继承线程 Thread
    public class ThreadDemoOne extends  Thread{
        @Override
        public void run() {
            System.out.println("继承 Thread ==> 相关业务逻辑");
            super.run();
        }
    }

1.3.2 实现接口Runnable (无返回值)

   // 方式二 实现接口Runnable (无返回值)
    public class ThreadDemoTwo implements  Runnable{
        @Override
        public void run() {
            System.out.println("实现接口Runnable ==>相关业务逻辑");
        }
    }

1.3.3 实现接口Callable (带返回值)

// 方式三 实现接口Callable (带返回值)
    public class ThreadDemoThree implements Callable{

        @Override
        public Object call() throws Exception {
            System.out.println("实现接口Callable ==>相关业务逻辑");
            return null;
        }
    }

1.4线程执行的流程

从程序发出指令之后cpu执行的简短流程

图形:

 

二、多线程带来的安全性问题

 特性:原子性、有序性、可见性

原子性:多线程的不确定性,对资源的抢夺是不确定的,比如:多线程count++中

有序性:这个就涉及到指令重排序。涉及到cpu的高速缓存L1 L2、代码的顺序和执行的顺序不一定是一样的。针对一个变量。在cpu中如果需要,可能会优先运行。new Person -->指令分为三步

可见性:a理论上,所有的资源应该是需要从内存中读取,但是由于cpu高速缓存,导致修改之后的数据没有回写给内存。b:指令优化等 volatile 可以处理这种问题。 true  -->另开线程 false 

 

三、如何解决安全性问题

3.1 基本概念

针对带来的安全性问题,我们可以采用相关的策略。更多API可以查看 第四点

  1. 原子性:automicXXX,synchronized,lock
  2. 有序性: volatile 、lock、BlockingQueue
  3. 可见性: volatile ,共享变量、final、synchronized

可见性涉及到cpu内部高速缓存,导致内存数据未及时更新。多线程之间数据的不可见性。

volatitle:解决可见性,防止cpu缓存,让缓存失效。

3.2 如何自己实现上锁操作

1.怎么实现一个锁?需要考虑什么问题呢?如下:

1.条件互斥,共享资源(cas)
cas实现
2.等待队列(抢夺资源的线程存放)
BlockingQueue,链表
3.阻塞
sleep/wait/join/park
4.唤醒
notify/notifyall/unpark

四、线程相关使用工具

4.1相关同步API(了解)

线程同步类 CountDownLatch   Semaphore  CyclicBarrier  
并发集合类 ConcurrentHashMap .ConcurrentSkipListMap , CopyOnWriteArrayList ,BlockingQueue 
线程池: Executors  
锁:StampedLock(1.8引入)  ReentrantLock 
原子操作:LongAdder (1.8引入,比AtomicLong 好)
  // 实现runnable,或者继承Thread ,返回异常给调用方捕捉。如果实现(Callable接口可以返回参数就不用了)
         Thread.currentThread().setUncaughtExceptionHandler();

4.2线程池相关的知识点(掌握)

     线程使应用能够更加充分合理地协调利用CPU 、内存、网络、1/0 等系统资源。线程的创建需要开辟虚拟机栈、本地方法枝、程序计数器等线程私有的内存空间。在线程销毁时需要回收这些系统资源。频繁地创建和销毁线程会浪费大量的系统资源,增加并发编程风险。另外,在服务器负载过大的时候,如何让新的线程等待或者友好地拒绝服务?这些都是线程自身无法解决的。所以需要通过线程池协调多个线程, 并实现类似主次线程隔离、定时执行、周期执行等任务。

 4.2.1 ThreadPoolExecutor相关参数

corePoolSize:常驻核心数。不会销毁的线程
maximumPool:线程池能够容纳同时执行的最大线程数
keepAliveTime:线程池中的线程空闲时间,当空闲时间达到keepAliveTime 值时,线程会被销毁
TimeUnit:keepAliveTime的时间单位通常是TimeUnit.SECONDS 。
workQueue:缓存队列。当请求数大于线程池能够容纳同时执行的最大线程数时。进入缓存队列
ThreadFactory:线程工厂,分组名称。方便后期出问题时精确定位
handler:执行拒绝策晤的对象。当缓存队列达到上限时,开始执行拒绝策略 RejectedExecutionHandler

 4.2.2 线程池提供静态创建

//创建持有足够线程的线程池支持给定的并行度, 并通过使用多个队列减少竞争
Executors.newWorkStealingPool

//maximumPoolSize 最大可以至Integer. MAX_VALUE, 是高度可伸缩的线程池,
Executors.newCachedThreadPool

//最大卫Integer.max_value 不回收线程相比Timer , Schedu l edExecutorService 更安全,
功能更强大, 与newCachedThreadPool 的区别是不回收工作线程。
Executors.newScheduledThreadPool

//建个单线程的线程池,相当于单线程串行执行所有任务, 保证接任务的提交顺序依次执行。
Executors.newSingleThreadExecutor

//输入的参数即是固定线程数,既是核心线程
数也是最大线程数, 不存在空闲线程,所以keepAliveTime 等于O
Executors.newFixedThreadPool


4.2.3猜想一下线程池的实现原理

  我们是不是可以自己弄呢?

   1.明确为何需要线程池?

        池化技术,防止高并发时,资源上面的耗尽和重复创建。限流保护机制

   2. 线程池的如何设计呢?

      线程执行时,run方法完成就会结束,如何创建线程不销毁呢?

  •       1.死循环
  •       2 不能无限循环。需要阻塞
  •      3 保证有任务就执行,没有任务就阻塞

    基本上就是按着这个进行的 

   

4.2.4其他

第一题 问:如何实现一个订阅发布呢?

答:阻塞队列,原理:notify/wait

 第二题:怎么算是线程执行完成呢?

 答:run 方法运行完成

第三:线程的状态有几种。两种等待的区别

答:共六种, new ,runabled,waitting ,TIMED_WAITING.block ,terminated.  ==> waitting 需要唤醒,属于被动唤醒,TIMED_WAITING超时等待==>约定时间之后,自己会自动唤醒,属于主动唤醒

第四:什么是可重入锁

答:就是方法调用方法,递归,可以共用同一把锁,不会发生死锁,ReentrantLock 和synchronized 都属于可重入锁

第五:synchronized 和 ReentrantLock 的区别

答:

都属于可重入锁。

  • 特性==> 
  • synchronized  非公共锁 , ReentrantLock  支持fair and no fair 
  • synchronized  被动释放锁 ,ReentrantLock  主动释放锁

    synchronized 属于关键字, ReentrantLock 属于对象。

 

 

 

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

java多线程-Thead线程学习记录笔记 的相关文章

  • 多线程与高并发编程进阶(二)

    前言 前文多线程与高并发入门中 已经介绍了多线程编程的目的以及实际应用中可能会遇到的问题 本文接着叙述关于多线程并发机制的底层原理 volatile以及synchronized 一般来说 Java代码从编写到最后的执行会经历以下的过程 Ja
  • 多线程的作用

    1 发挥多核CPU的优势 随着工业的进步 现在的笔记本 台式机乃至商用的应用服务器至少也都是双核的 4核 8核甚至16核的也都不少见 如果是单线程的程序 那么在双核CPU上就浪费了50 在4核CPU上就浪费了75 单核CPU上所谓的 多线程
  • 多线程学习----join()的用法

    join的用法一 join 方法可以使得一个线程在另一个线程结束后再执行 如果join 方法在一个线程实例上调用 当前运行着的线程将阻塞直到这个线程实例完成了执行 首先来看个例子 author QingHe Creation on 2005
  • 等待和通知机制(wait和notify)

    1 等待和通知机制的实现 wait 方法 wait 是 Object 类的方法 它的作用是使当前执行wait方法的线程进行等待 该方法将当前线程置入 预执行队列 中 并在 wait 所在的代码行处停止执行 直到接到通知或者被中断才能继续执行
  • java多线程设计模式

    1 I O处理比较花费时间 故把执行I O处理和非IO处理的线程分开 CPU执行速度很快 而内存的写入 读取很慢 所以有关CPU和内存交互会降低指令的速度 2 start方法运行有2个步骤 启动新的线程 运行new对象的run方法 3 所有
  • 【JAVA多线程11】线程基本方法-线程等待(wait)/线程唤醒(notify)

    1 wait notify notifyAll 方法是Object的本地final方法 无法被重写 2 wait 使当前线程阻塞 前提是 必须先获得锁 一般配合synchronized 关键字使用 即 一般在synchronized 同步代
  • Java 多线程事务回滚 ——多线程插入数据库时事务控制

    背景 日常项目中 经常会出现一个场景 同时批量插入数据库数据 由于逻辑复杂或者其它原因 我们无法使用sql进行批量插入 串行效率低 耗时长 为了提高效率 这个时候我们首先想到多线程并发插入 但是如何控制事务呢 直接上干货 实现效果 开启多条
  • 看一眼就会Java多线程!(如何全面理解多线程)

    基本概念 程序 进程 线程 程序 program 是为了完成特殊任务 用某种语言编写的一组指令的集合 即指 一段静态的代码 静态对象 进程 process 是程序的一次执行过程 或是 正在运行的一个程序 是一个动态的过程 有它自身的产生 存
  • Java中如何捕获其他线程抛出的异常

    如Java中另一个线程抛出的异常 可以使用公共静态接口Thread UncaughtExceptionHandler完成 Thread UncaughtExceptionHandler是当线程因未捕获的异常而突然终止时调用的处理程序接口 当
  • Java多线程技术详解(全都是细节!)

    多线程启动 线程有两种启动方式 实现Runnable接口 继承Thread类并重写run 方法 1 Thread 与 Runnable Runnable接口表示线程要执行的任务 当Runnable中的run 方法执行时 表示线程在激活状态
  • Java同步方法及代码块

    同步方法及代码块 synchronized 同步方法 由于我们可以通过private关键字来保证数据对象只能被方法访问 所以我们只需要针对方法提出一套机制 这套机制就是synchronized关键字 它包括两种用法 synchronized
  • java线程池的使用

    线程池概述 线程池 Thread Pool 是一种基于池化思想管理线程的工具 使用线程池可以带来诸多好处 降低资源消耗 通过池化技术复用已创建的线程 减少线程创建和销毁的损耗 提高响应速度 任务到达时 特定情况下无需再创建线程 便于管理 j
  • Java多线程——为什么弃用stop、suspend、resume方法

    初始的Java版本定义了一个stop方法用来终止一个线程 以及一个suspend方法用来阻塞一个线程直至另一个线程调用resume stop和suspend方法有一些共同点 都试图控制一个给定线程的行为 stop suspend和resum
  • Java多线程 - 线程状态

    线程状态 五个状态 新生 就绪 运行 死亡 阻塞 停止线程 不推荐使用JDK提供的stop destroy 方法 已弃用 推荐线程自己停止 建议用一个标志位进行终止变量 到flag false 则终止线程运行 public class St
  • Java并发编程:并发容器之CopyOnWriteArrayList(转载)

    http www cnblogs com dolphin0520 p 3938914 html 原文链接 http ifeve com java copy on write Copy On Write简称COW 是一种用于程序设计中的优化策
  • Java多线程:解决高并发环境下数据插入重复问题

    1 背景描述 应用框架 Spring SpringMVC Hibernate 数据库 Oracle11g 一家文学网站向我系统推多线程低并发推送数据 我这边观察日志和数据库 发现有一个作者被存储了2次到数据库中 按照程序的编写逻辑 重复的数
  • java定时器Timer的使用

    在JDK库中Timer类主要负责计划任务的功能 也就是在指定的时间开始执行某一个任务 Timer类的主要作用就是设置计划任务 但是封装任务的类的是TimerTask类 下面展示几个例子 在指定的日期执行一次某一任务 import java
  • 多线程太可怕了

    今天发现了一个多线程引起的bug 然后进一步体会到 这东西太容易出问题了 首先要说明的是 出问题的代码可不是一般人写的 是由一个叫EPAM systems的世界知名外包公司的人写的 这些java程序员个个经验丰富 心高气傲 貌似base在乌
  • Java多线程(四):什么是死锁以及如何解决死锁

    目录 1 什么是死锁 2 死锁产生的原因 3 如何解决死锁问题 3 1 改变环路等待条件 3 2 破坏请求并持有条件 1 什么是死锁 死锁 是指两个或两个以上的进程在执行过程中 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象 若无外力作
  • 多线程案例:购买车票

    购票案例 多线程同步 多线程的并发执行虽然可以提高程序的效率 但是 当多个线程去访问同一个资源时 也会引发一些安全问题 并发 同一个对象被多个线程同时操作 处理多线程问题时 多个线程访问同一个对象 并且某些线程还想修改这个对象 这时候我们就

随机推荐

  • FatMouse' Trade(贪心算法)

    FatMouse Trade Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 45918 Accep
  • 案例驱动python编程入门-python监听socket客户端连接(驱动串口屏幕)

    实例简介 实例截图 核心代码 import socket import os import sys import struct def socket service data try s socket socket socket AF IN
  • 轨迹规划五次多项式学习

    五次多项式是一种常用的平滑轨迹规划方法 可以在运动过程中使得机器人的加速度和曲率连续变化 以达到平滑 稳定控制的效果 这里简单介绍如何通过五次多项式来求解运动轨迹 假设我们要将一个物体从起始点 x0 y0 运动到终止点 xT yT 并且要求
  • React框架(十九)在使用style-components的同时引入.css文件

    什么是style components style components是针对React写的一套css in js框架 简单来讲就是在js中写css 相对于与预处理器 sass less 的好处是 css in js使用的是js语法 不用重
  • 小程序-云开发

    小程序 云开发 小程序 云开发 小程序 云开发 什么是小程序云开发 云开发优势 能力概览 配置环境开发 准备工作 第 1 步 创建项目 第 2 步 开通云开发 第 3 步 开始开发 第三方快速注册的小程序 第三方快速注册小程序支持云开发 方
  • Leetcode 485最大连续1的个数

    题目描述 方法 暴力求解 自己想到的思路就是遍历一遍 创建一个新的vector和记录最大值的v max 将等于1的放入新vector中 然后比较新容器大小和v max 如果大于就记录下最大的新容器大小 目的是记录最大的长度 改进 将新数组换
  • Qt5解决中文乱码问题

    Qt5中解决运行时中文乱码 中文乱码问题 中文乱码问题 代码中字符串正常显示 运行时显示乱码 解决方法有如下三种方法 第一种方法 this gt setWindowTitle QString fromLocal8Bit 中文乱码问题 ui
  • 【Web3】认识以太坊钱包

    目录 区块链钱包概念 密码 私钥 Private Key 公钥Public Key Keystore 助记词 Mnemonic 如何解锁账户 区块链钱包概念 钱包用来存钱的 在区块链中 我们的数字资产都会对应到一个账户地址上 只有拥 有账户
  • Neural ODE 神经常微分方程

    Neural ODE ODE常微分方程 欧拉法求解 欧拉法求解过程是一个递归的过程 这个思想和牛顿法 梯度下降法是相似的 并且它将函数离散化 分割成一个个小段来求解 欧拉法求解的常微分方程的形式通常为 图片来自知乎Neural ODE 这个
  • 如何在R语言中找到统计值最小所在的分组

    如何在R语言中找到统计值最小所在的分组 介绍 在数据分析和统计中 我们经常需要找到某个统计值在不同分组中的最小值所在的组别 在R语言中 我们可以使用一些函数和技巧来实现这个目标 本文将介绍如何使用R语言找到统计值最小所在的分组 并提供相应的
  • 算法讲解:二分图匹配【图论】

    二分图匹配 自然要先从定义入手 那么二分图是什么呢 二分图 二分图又称作二部图 是图论中的一种特殊模型 设G V E 是一个无向图 如果顶点V可分割为两个互不相交的子集 A B 并且图中的每条边 i j 所关联的两个顶点i和j分别属于这两个
  • 前端工程师必须收藏的 JavaScript 资源大全

    我想很多程序员应该记得 GitHub 上有一个 Awesome XXX 系列的资源整理 awesome javascript 是 sorrycc 发起维护的 JS 资源列表 内容包括 包管理器 加载器 测试框架 运行器 QA MVC框架和库
  • Go语言的JSON 库

    1 Go语言的JSON 库 Go语言自带的JSON转换库为 encoding json 1 1 其中把对象转换为JSON的方法 函数 为 json Marshal 其函数原型如下 func Marshal v interface byte
  • innodb的锁

    一致性锁定读和一致性非锁定读 Read Committed和Repetable Read级别下采用MVCC 实现非锁定读 但在一些情况下 要使用加锁来保障数据的逻辑一致性 自增列 锁的算法 唯一值 MySQL 中关于gap lock nex
  • qt delegate 委托 多级联动 小结

    最近使用qt写程序用到了treewidget和tablewidget 涉及到编辑默认情况下可以设置treewidget和tablewidget的item可编辑属性来进行编辑 默认情况只是简单的文本输入格式 在qt的demo中看到了spin
  • ES6详解(持续更)

    前言 之前对ES6也有过学习使用 但是都没有深入系统去看看文档书籍 这里开始对一些ES6语法进行整理总结 本文基于阮一峰ES6入门 线上地址 阮一峰ES6入门 let和const命令 1 let命令 如果使用let 声明的变量仅在块级作用域
  • android之adb connect手机设备

    adb手机连接是Android开发过程中常用的 也可以通过无线wifi来连接手机 但是百度搜索了一大堆资料都不全面 而且认知还不全面 导致浪费生命 有时候浪费个人的时间反而更加惹人恶心 window10电脑adb环境搭建 错误提示 adb
  • 人工智能入门学习笔记(一)

    家人们 好久不见哈 最近在尝试着学习人工智能的相关知识和具体技能呀 说实话 当像我这样的 小白初探人工智能体系时 总是被很多未知的名词以及茫茫内容所淹没 便去想通过网络学习帮助自己建立正确的人工智能基本概念认知 在此 我便进一步对人工智能体
  • Token的验证流程以及用法

    一 身份验证流程 1 用户向服务器发送用户名和密码 2 服务端收到请求 去验证用户名与密码 3 验证成功后 服务端会签发一个 Token 将这个 Token 发送给客户端 4 客户端收到 Token 以后可以把它存储起来 放在 Cookie
  • java多线程-Thead线程学习记录笔记

    介绍的内容 主要介绍多线程的基本概念到后面的基本使用 以及一些稍微的原理猜测 个人笔记 不喜勿喷 目录 目录 一 线程使用 1 1 概念 1 2 线程生命周期 1 3 java中实现的方式 1 3 1 继承线程 Thread 1 3 2 实