首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

java深入理解多线程

后端 526.34KB 13 需要积分: 1
立即下载

资源介绍:

Java多线程是并发编程中的一个重要概念,它允许程序在同一时刻执行多个任务。以下是对Java多线程的深入理解: 线程概述 基本概念:线程是操作系统能够进行运算调度的最小单位,一个进程可以包含多个线程。 特性:线程不拥有系统资源,只拥有一点必不可少的、能保证独立运行的资源。同一进程中的线程共享该进程的资源,但各自拥有独立的堆栈和局部变量。 线程创建与启动 创建方式:在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。 启动方法:通过调用线程对象的start()方法来启动线程,这将导致run()方法被调用。 线程状态 线程在其生命周期中会经历新建态、就绪态、运行态、阻塞/等待/超时等待和死亡态等状态。 线程同步 同步问题:在多线程环境中,当多个线程访问共享资源时,可能会出现数据不一致和竞态条件等问题。 解决方法:使用synchronized关键字或锁机制(如ReentrantLock)来确保同一时间只有一个线程可以访问被同步的代码。 线程通信 Object类中的wait()、notify()和notifyAll()方法提供了一种线程间的通信方式。 高级
小牛和同学开发的八股文网站http://interviewtop.top 持续更新BAT面试题。
简述java内存模型(JMM
java内存模型定义了程序中各种变量的访问规则。其规定所有变量都存储在主内存,线程均有自己的工
作内存。
工作内存中保存被该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作空间进行,不
能直接读写主内存数据。操作完成后,线程的工作内存通过缓存一致性协议将操作完的数据刷回主存。
简述as-if-serial
编译器等会对原始的程序进行指令重排序和优化。但不管怎么重排序,其结果和用户原始程序输出预定
结果一致。
简述happens-before八大原则
程序次序规则:一个线程内写在前面的操作先行发生于后面的。
锁定规则: unlock 操作先行发生于后面对同一个锁的 lock 操作。
volatile 规则:对 volatile 变量的写操作先行发生于后面的读操作。
线程启动规则:线程的 start 方法先行发生于线程的每个动作。
线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生。
线程终止规则:线程中所有操作先行发生于对线程的终止检测。
对象终结规则:对象的初始化先行发生于 finalize 方法。
传递性规则:如果操作 A 先行发生于操作 B,操作 B 先行发生于操作 C,那么操作 A 先行发生于操作
C
as-if-serial happens-before 的区别
as-if-serial 保证单线程程序的执行结果不变,happens-before 保证正确同步的多线程程序的执行结果不
变。
简述原子性操作
一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行,这就是
原子性操作。
简述线程的可见性
可见性指当一个线程修改了共享变量时,其他线程能够立即得知修改。volatile,synchronized,final都能
保证可见性。
简述有序性
即虽然多线程存在并发和指令优化等操作,在本线程内观察该线程的所有执行操作是有序的。
简述javavolatile关键字作用
1. 保证变量对所有线程的可见性。
当一条线程修改了变量值,新值对于其他线程来说是立即可以得知的。
2. 禁止指令重排序优化。使用 volatile 变量进行写操作,汇编指令带有 lock 前缀,相当于一个内存屏
障,编译器不会将后面的指令重排到内存屏障之前。
java线程的实现方式
1. 实现Runnable接口
2. 继承Thread类。
3. 实现Callable接口
简述java线程的状态
线程状态有New, RUNNABLE, BLOCK, WAITING, TIMED_WAITING, THERMINATED
NEW:新建状态,线程被创建且未启动,此时还未调用 start 方法。
RUNNABLE: 运行状态。其表示线程正在JVM中执行,但是这个执行,不一定真的在跑,也可能在排队
CPU
BLOCKED:阻塞状态。线程等待获取锁,锁还没获得。
WAITING: 等待状态。线程内run方法运行完语句Object.wait()/Thread.join()进入该状态。
TIMED_WAITING:限期等待。在一定时间之后跳出状态。调用Thread.sleep(long) Object.wait(long)
Thread.join(long)进入状态。其中这些参数代表等待的时间。
TERMINATED:结束状态。线程调用完run方法进入该状态。
简述线程通信的方式
1. volatile 关键词修饰变量,保证所有线程对变量访问的可见性。
2. synchronized关键词。确保多个线程在同一时刻只能有一个处于方法或同步块中。
3. wait/notify方法
4. IO通信
简述线程池
没有线程池的情况下,多次创建,销毁线程开销比较大。如果在开辟的线程执行完当前任务后执行接下
来任务,复用已创建的线程,降低开销、控制最大并发数。
线程池创建线程时,会将线程封装成工作线程 WorkerWorker 在执行完任务后还会循环获取工作队列
中的任务来执行。
将任务派发给线程池时,会出现以下几种情况
1. 核心线程池未满,创建一个新的线程执行任务。
2. 如果核心线程池已满,工作队列未满,将线程存储在工作队列。
3. 如果工作队列已满,线程数小于最大线程数就创建一个新线程处理任务。
4. 如果超过大小线程数,按照拒绝策略来处理任务。
线程池参数
1. corePoolSize:常驻核心线程数。超过该值后如果线程空闲会被销毁。
2. maximumPoolSize:线程池能够容纳同时执行的线程最大数。
3. keepAliveTime:线程空闲时间,线程空闲时间达到该值后会被销毁,直到只剩下 corePoolSize
线程为止,避免浪费内存资源。
4. workQueue:工作队列。
5. threadFactory:线程工厂,用来生产一组相同任务的线程。
6. handler:拒绝策略。有以下几种拒绝策略:
AbortPolicy:丢弃任务并抛出异常
CallerRunsPolicy 重新尝试提交该任务
DiscardOldestPolicy 抛弃队列里等待最久的任务并把当前任务加入队列
DiscardPolicy 表示直接抛弃当前任务但不抛出异常。
线程池创建方法
1. newFixedThreadPool,创建固定大小的线程池。
2. newSingleThreadExecutor,使用单线程线程池。
3. newCachedThreadPoolmaximumPoolSize 设置为 Integer 最大值,工作完成后会回收工作线程
4. newScheduledThreadPool:支持定期及周期性任务执行,不回收工作线程。
5. newWorkStealingPool:一个拥有多个任务队列的线程池。
简述Executor框架
Executor框架目的是将任务提交和任务如何运行分离开来的机制。用户不再需要从代码层考虑设计任务
的提交运行,只需要调用Executor框架实现类的Execute方法就可以提交任务。产生线程池的函数
ThreadPoolExecutor也是Executor的具体实现类。
简述Executor的继承关系
Executor:一个接口,其定义了一个接收Runnable对象的方法executor,该方法接收一个Runable
实例执行这个任务。

资源文件列表:

深入简出多线程.zip 大约有1个文件
  1. 深入简出多线程.pdf 588.32KB
0评论
提交 加载更多评论
其他资源 软件工程模块流程分析.zip
软件工程模块流程分析.zip
ElectroSmartCar_quad-main.zip
ElectroSmartCar_quad-main.zip
stm32小车.zip
stm32小车.zip
linemod算法的C++原始代码
opencv中linemod算法置于contribute库中,官方预编译的opencv库是不带这个库的。可实现实时的多角度多尺度模板匹配,同时带有原始论文。
【Chrome谷歌浏览器】篡改猴(油猴/tempermongkey)插件安装包
tempermongkey篡改猴插件安装包,适用Chrome谷歌浏览器
HOOKUI1.8.8.1-build-23-release-密码123.zip
hookui 1.8.1 密码123
PHP 和 MySQL 构建的高效简洁的内容管理系统.zip
iCMS 是一套采用 PHP 和 MySQL 构建的高效简洁的内容管理系统,为您的网站提供一个完美的开源解决方案
【微信小程序源码期末大作业毕业设计】仿网易蜗牛读书-小程序项目源码.zip
【微信小程序源码期末大作业毕业设计】仿网易蜗牛读书-小程序项目源码