【Java 多线程并发】 阻塞队列DelayedWorkQueue
【Java 多线程并发】 阻塞队列DelayedWorkQueueMetadatatitle: 【Java 多线程并发】 阻塞队列DelayedWorkQueue
date: 2023-07-05 12:58
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 阻塞队列DelayedWorkQueue
前言线程池运行时,会不断从任务队列中获取任务,然后执行任务。如果我们想实现延时或者定时执行任务,重要一点就是任务队列会根据任务延时时间的不同进行排序,延时时间越短的就排在队列的前面,先被获取执行。
队列是先进先出的数据结构,就是先进入队列的数据,先被获取。但是有一种特殊的队列叫做优先级队列,它会对插入的数据进行优先级排序,保证优先级越高的数据首先被获取,与数据的插入顺序无关。
实现优先级队列高效常用的一种方式就是使用堆。
S ...
【Java 多线程并发】 ThreadPoolExecutor
【Java 多线程并发】 ThreadPoolExecutorMetadatatitle: 【Java 多线程并发】 ThreadPoolExecutor
date: 2023-07-05 12:34
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 ThreadPoolExecutor
线程池框架
第一层结构
sun.nio.ch.AsynchronousChannelGroupImpl(Iocp) 异步channel –AIO相关实现
java.util.concurrent.CompletableFuture.ThreadPerTaskExecutor (启动一个线程执行)
sun.net.httpserver.ServerImpl.DefaultExecutor (more执行器,直接执行)
com.s ...
【Java 多线程并发】 线程池的ctl属性
【Java 多线程并发】 线程池的ctl属性Metadatatitle: 【Java 多线程并发】 线程池的ctl属性
date: 2023-07-05 12:27
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 线程池的ctl属性
ctl介绍ThreadPoolExecutor中有一个控制状态的属性叫ctl,它是一个AtomicInteger类型的变量,它包含两个概念:
workerCount:表明当前有效的线程数
runState:表明当前线程池的状态,是否处于Running,Shutdown,Stop,Tidying,Terminate五种状态。
为了把这两种状态放到一个int值(共32位)中保存,代码中限定了workerCount的值是2^29-1,因为还有五种状态需要表示,至少需要3位才能表示五种状态(3 ...
【Java 多线程并发】 线程池的内部类Worker
【Java 多线程并发】 线程池的内部类WorkerMetadatatitle: 【Java 多线程并发】 线程池的内部类Worker
date: 2023-07-05 12:15
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 线程池的内部类Worker
【Java 多线程并发】 线程池的内部类WorkerWorker是ThreadPoolExecutor中的内部类,它其实就可以相当于线程池中存储的线程,用它来执行提交给线程池的任务,但是这个worker并不是一个单纯的线程,而是它的属性中持有一个线程,它还有其他的属性,用来做一些数据统计以及实现一些执行任务相关的功能。
Worker类对象的类图
Worker类对象的解释线程池中的线程,都会被封装成一个Worker类对象,ThreadPoolExecutor维护的其实 ...
【Java 多线程并发】 Schedule 定时任务
【Java 多线程并发】 Schedule 定时任务Metadatatitle: 【Java 多线程并发】 Schedule 定时任务
date: 2023-07-05 12:01
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 Schedule 定时任务
简介在实现定时调度功能的时候,我们往往会借助于第三方类库来完成,比如:quartz、Spring Schedule等等。JDK从1.3版本开始,就提供了基于Timer的定时调度功能。在Timer中,任务的执行是串行的。这种特性在保证了线程安全的情况下,往往带来了一些严重的副作用,比如任务间相互影响、任务执行效率低下等问题。为了解决Timer的这些问题,JDK从1.5版本开始,提供了基于ScheduledExecutorService的定时调度功能。
虽然Java的定 ...
【Java 多线程并发】 Executors框架创建线程池
【Java 多线程并发】 Executors框架创建线程池Metadatatitle: 【Java 多线程并发】 Executors框架创建线程池
date: 2023-07-05 11:44
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 Executors框架创建线程池
【Java 多线程并发】 Executors框架创建线程池以下是使用 Executors框架去创建的线程池,是Java内置的线程池,已经设好了相应的参数。
用法:ExecutorService executorService = Executors.newFixedThreadPool(2);
通过Executor框架对线程池的构建,都是基于 ThreadpoolExecutor 构造方法来构建的。
newCachedThreadPool作用:创建 ...
【Java 多线程并发】 Java线程池的核心参数
【Java 多线程并发】 Java线程池的核心参数Metadatatitle: 【Java 多线程并发】 Java线程池的核心参数
date: 2023-07-05 10:33
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 Java线程池的核心参数
简介ThreadPoolExecutor的构造方法是创建线程池的入口,虽然比较简单,但是信息量很大,由此也能引发一系列的问题,构造方法中有很多核心参数,这也是面试中经常被问到的问题。
Executors创建线程池也是基于ThreadPoolExecutor的构造方法实现的。定时任务线程池还基于ScheduledThreadPoolExecutor的构造方法,但归根结底还是基于ThreadPoolExecutor,所以下面我们对线程池核心参数的讲解都是基于ThreadPoo ...
【Java 多线程并发】 线程池
【Java 多线程并发】 线程池Metadatatitle: 【Java 多线程并发】 线程池
date: 2023-07-05 10:30
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 线程池
什么是线程池顾名思义,线程池就是管理一系列线程的资源池。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。
在 Java 中,如果每个请求到达就创建一个新线程,创建和销毁线程花费的时间和消耗的系统 资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。 如果在一个 JVM里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。
为了解决这个问题,就有了线程池的概念,线程池的核心逻辑是提前创建好若干个线程放在一个容器中。如果有任务需要处理, ...
【Java 多线程并发】 Future机制
【Java 多线程并发】 Future机制Metadatatitle: 【Java 多线程并发】 Future机制
date: 2023-07-05 09:54
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 Future机制
概述核心思想
一个方法f,计算过程可能非常耗时,等待f返回,显然不明智。可以在调用f的时候,立马返回一个Future,可以通过Future这个数据结构去控制方法f的计算过程。
方法
get方法:获取计算结果(如果还没计算完,也是必须等待的)
cancel方法:还没计算完,可以取消计算过程
isDone方法:判断是否计算完
isCancelled方法:判断计算是否被取消
FutureTask
FutureTask是Future的具体实现。FutureTask实现了RunnableFuture接 ...
【Java 多线程并发】 线程中断
【Java 多线程并发】 线程中断Metadatatitle: 【Java 多线程并发】 线程中断
date: 2023-07-04 23:52
tags:
- 行动阶段/完成
- 主题场景/程序
- 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
- 细化主题/Java
categories:
- Java
keywords:
- Java
description: 【Java 多线程并发】 线程中断
概述线程中断
Java中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。通过 Thread#interrupt() 给线程该线程一个标志位
线程阻塞
Java 中提供了一个较为底层的并发工具类:LockSupport,该类中的核心方法有两个:park(Object blocker) 以及 unpark(Thread thred),前者表示阻塞指定线程,后者表示唤醒指定的线程。
中断方法
interrupt()是一个动词,表示中断线程。
本质调用 ...