ThreadPoolExecutor
: 创建一个 thread pool, pool 中每个 thread 称为 worker,负责执行任务(Task), task个数如果不大于线程池的个数,则分别分给线程池里的各个线程,否则 task 入队列, worker 执行完自己 task,去队列取新任务执行。直到队列里面没有任务,park 住线程池中的线程。
AQS
: tryAcquire(),尝试让当前线程获得锁,获得则设置当前线程为执行线程,返回 true,否则返回 false.
acquire(),让当前线程获得锁,如获得,直接执行当前线程。 否则包装当前线程为 Node,进入等待队列,同时设置前驱 prep 的 status 为 -1,表示前驱出队列时会激活自己,通过 LockSupport.park 刮起自己。
tryRelease,尝试释放锁。
release(),释放锁。
Sync
: lock(),
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
unlock(),
sync.release(1);
Condition
: 与 lock 关联, conditon = lock.newCondition(), 通过 condition.await()让当前线程进入condition等待队列
(注:与线程等待队列
区别,前者通过 prep, next 联系,后者通过 nextWaiter联系
),一个锁的每个 condition 都可能有自己的 condition 队列,所以一个锁,含有n个 condition,共可能有 1+n个队列。当收到 condition.single()时,condition 线程从 condition 队列加入到 线程等待队列尾部,等待以后执行。
CountDownLatch
: CountDownLatch(n)
, 即:首先加上 n把锁
,以后每个 CountDownLatch 使用线程可以 通过 countDown减掉一把锁,同时 LockSupport.park 该线程,所以只有减最后一把锁的时候,才会释放占有的资源
,LockSupport.unpark 锁定的线程。因此等待队列的一个线程可能有两个地方激活他:1,最后一把锁释放时候激活等待队列的所有该锁的等待线程。 2,最后一把锁释放,激活等待队列的该锁的第一个等待线程,该线程激活后继线程。
CyclicBarrier
: 类似 CountDownLatch,CyclicBarrier(n)
--> 表示 acquire(n),首先加上 n 把锁
,但是用另外一个变量保存锁的个数
,这样每个CyclicBarrier使用线程可以通过 await() 减去一把锁,同时 LockSupport.park 该线程,直到最后一把锁减去时, LockSuport.unpark 所有锁定线程
,同时:重置锁的个数为 n
,再次循环上面过程。
Semaphore
:Semaphore(n)
,首先表示资源最多可以有 n把锁同时使用才能锁上,与CountDownLatch和CyclicBarrier 最大区别为
前者的锁为并联
,只要有一把锁就锁定资源
, Semaphore 为串连
,只有所有锁都锁上,才能锁住
资源,acquire();表示加上一把锁,release()表示释放一把锁,其他线程可以立即获得该锁。 所以 Semaphore(1),跟 Lock 功能类似。
FutureTask
:执行完任务返回
。使用 Callable()执行,而线程 Callable() 执行可以返回结果。 所以可以通过设置当前线程执行者runner,和执行线程 Callable 状态表示执行的线程是否完成。 例如: Callable 返回结果,并且 runner为null
, 则该线程执行结束。
下图部分为 ThreadPoolExecutor 一个演示过程(注:该图只是一种可能结果,因为线程执行的不确定性),部分为 Lock的演示过程。
- 大小: 391.8 KB
分享到:
相关推荐
线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor实战及其原理分析(下)线程池ThreadPoolExecutor...
线程池ThreadPoolExecutor实战及其原理分析(上)
线程池ThreadPoolExecutor底层原理源码分析
ThreadPoolExecutor 的核心参数包括 corePoolSize、maxPoolSize 和 keep-alive time。 * corePoolSize: 表示线程池的核心线程数。这是线程池的基本容量,表示线程池中总是存在的线程数。 * maxPoolSize: 表示线程池...
ThreadPoolExecutor使用和思考
线程池原理-ThreadPoolExecutor源码解析 1.构造方法及参数 2.阻塞对列: BlockingQueue 3.线程工厂: DefaultThreadFactory 4.拒绝策略: RejectedExecutionHandler 5.执行线程 Executor
### 线程池 `ThreadPoolExecutor` 原理源码分析 #### 一、概述 线程池作为 Java 并发编程中的重要组件,在实际应用中被广泛使用。其核心类 `ThreadPoolExecutor` 实现了对线程的管理、调度等功能。本文将围绕 `...
ThreadPoolExecutor的使用和Android常见的4种线程池使用介绍
了解ThreadPoolExecutor的这些核心概念和工作流程,能帮助开发者更好地调整线程池参数,优化并发性能,以及在系统出现问题时进行排查和定位。在实际开发中,合理配置线程池参数,避免线程池过载,是保障系统稳定运行...
通过上述对`ThreadPoolExecutor`线程池底层实现原理的解析,我们可以看到Java线程池的强大之处在于其高效的状态管理和任务调度机制。通过对`ctl`变量的巧妙利用,线程池能够有效地管理线程状态和数量,从而实现高...
根据提供的文件信息,我们可以深入探讨线程池`ThreadPoolExecutor`的工作原理及其实现细节,同时也会涉及并发编程中的一些关键概念和技术。 ### 线程池`ThreadPoolExecutor`概述 `ThreadPoolExecutor`是Java中非常...
ThreadPoolExecutor源码解析.md
线程池的实现原理主要包括以下几个步骤: 1. 当提交一个任务到线程池时,线程池会检查当前运行的线程是否少于核心线程数`corePoolSize`,如果是,则创建新的线程执行任务。 2. 如果线程数量达到`corePoolSize`,新...
NULL 博文链接:https://bijian1013.iteye.com/blog/2284676
(转)线程池:java_util_ThreadPoolExecutor 比较详细的介绍了ThreadPoolExecutor用法与属性
在这篇文章中,我们将深入探讨 ThreadPoolExecutor 的原理和实现机制,并探讨它在实际开发中的应用。 首先,让我们来了解一下线程池的概念。线程池是一种池化技术,它可以将线程作为对象来管理,以便重复使用线程,...
ThreadPoolExecutor线程池原理及其execute方法详解 ThreadPoolExecutor是Java并发包中提供的线程池类,用于管理和执行异步任务。ThreadPoolExecutor的执行原理可以分为四个步骤: 1.核心线程池:...
在IT行业中,Redis和Java的ThreadPoolExecutor是两个非常重要的工具,它们在处理高并发和任务调度方面发挥着关键作用。Redis是一种高效的键值存储系统,常用于缓存、消息队列等场景。而ThreadPoolExecutor是Java并发...
1.资源简介:PyQt5中使用多线程模块QThread解决了PyQt5界面程序执行比较耗时操作时,程序卡顿出现的无响应以及界面输出无法实时...2.适用人群:想学习PyQt5中多线程模块QThread和线程池ThreadPoolExecutor知识的人。