线程讲解(十三)

ForkJoinPool 类

ForkJoinPool 类是 Fork/Join 框架的核心,也是 Fork/Join 框架执行的入口点,它实现了接口 ExecutorService。ForkJoinPool 类的任务是负责管理线程,并提供线程执行状态和任务处理的相关信息。

ForkJoinPool 的创建

ForkJoinPool 类从 AbstractExecutorService 类继承,主要用于处理 ForkJoinTask 中的任务。
ForkJoinPool 类构造方法有三种形式:
1、ForkJoinPool() : 创建一个线程池,线程池中的线程数目根据CPU的核数设定。
2、ForkJoinPool(int parallelism) :用户指定线程池中线程的数目。
3、public ForkJoinPool(int parallelism, ForkJoinWorkerThreadFactory factory,UncaughtExceptionHandler handler, boolean asyncMode) :指明线程工厂、异常处理的handler 和 工作模式。

ForkJoinPool 的使用

ForkJoinPool 的使用大致可以分为两种:

  1. 通过invoke、execute 和 submit 执行任务。
  2. 在程序执行过程中通过 fork 操作执行的任务。

ForkJoinPool 常用的方法

  1. invoke(ForkJoinTask task) :是一个同步调用方法;处理给定任务并返回结果,返回结果的类型由 T 指定。
  2. invokeAll(Collection<? extendsCallable> tasks) : 是一个同步调用方法;执行给定的任务列表,返回持有任务状态和任务完成时的结果的Future列表。
  3. execute(ForkJoinTask<?> task) : 安排(异步)执行给定的任务,一般没有返回结果。
  4. execute(Runnable task) : 把一个 Runnable 线程所代表的任务送到 ForkJoinPool 中;ForkJoinPool 不会对 Runnable(Callable) 对象使用工作窃取算法,该算法只会被应用到 ForkJoinTask 对象中。
  5. submit(Callable task) :提交一个有返回值的任务用于执行,并返回一个可在未来获取任务结果的 Future。
  6. submit(ForkJoinTask task) :提交一个ForkJoinTask 用于执行。
  7. submit(Runnable task) :提交一个Runnable 任务用于执行,并返回一个该任务的Future表示。
  8. submit(Runnable task, T result) :提交一个 Runnable 任务用于执行,并返回一个该任务的 Future表示。

以上是三类执行任务的方法,对于三种方法的具体使用

在外部对 Fork/Join 操作调用在 Fork/Join 框架范围内调用
异步执行execute(ForkJoinTask)ForkJoinTask.fork()
同步执行(等待子任务完成)invoke(ForkJoinTask)ForkJoinTask.invoke()
执行并获得结果submit(ForkJoinTask)ForkJoinTask.fork()

以下方法可以用于监视 Fork/Join 框架的操作情况:

  1. awaitQuiescence(long timeout,TimeUnit unit): 如果被此池中的ForkJoinTask调用,等价于此方法:
  2. awaitTermination(long timeout,TimeUnit unit) :阻塞直到所有任务执行完毕。当任意以下情况出现则停止阻塞,以先发生为准:收到关闭请求、超时、线程中断。
  3. commonPool()返回common pool 实例。
  4. drainTasksTo(Collection<? superForkJoinTask<?>> c): 移除任务调度队列中所有未有效提交和已分解的任务,并将它们添加到给定的集合,但不改变其执行状态。
  5. getActiveThreadCount(): 返回当前正在窃取或执行任务的线程数的估计值。
  6. getAsyncMode(): 当使用先进先出模式时返回true
  7. getCommonPoolParallelism(): 返回common pool的目标并行级别
  8. getFactory() :返回线程工厂用于构造新的线程。
  9. getParallelism() :返回这个线程池的目标并行度
  10. getPoolSize() :返回已启动但尚未终止的工作线程数。
  11. getQueuedSubmissionCount() :返回还未开始运行的任务数的估计值。
  12. getQueuedTaskCount(): 返回工作线程的任务队列中总任务数的估计值(但不包括提交到池中但未开始执行的任务)。
  13. getRunningThreadCount() :返回处于未阻塞状态等待加入任务或其它同步管理的工作线程数的估计值。
  14. getStealCount(): 返回从其它线程任务队列中窃取的任务数估计值。
  15. getUncaughtExceptionHandler(): 返回内部工作线程在执行任务时遇到不可恢复的错误时的处理程序。
  16. hasQueuedSubmissions() :当存在已提交到当前线程池但尚未执行的任务时返回true。
  17. isQuiescent():当所有工作线程处于空闲时返回true。
  18. isShutdown() :此线程池已被关闭时返回true。
  19. isTerminated() :如果此池关闭后所有任务已停止,返回true。
  20. isTerminating() :如果此线程池正在终止任务但尚未全部终止,返回true。
  21. managedBlock(ForkJoinPool.ManagedBlocker blocker) :运行给定的可能阻塞任务。
  22. newTaskFor(Callable callable) :返回给定callable任务的RunnableFuture。
  23. newTaskFor(Runnable runnable, T value) :返回给定runnable任务和给定值的RunnableFuture
  24. pollSubmission() :如果存在下一个未运行的可用的已提交任务,将其返回并在任务队列中删除
  25. shutdown() :按此前提交任务的执行顺序来有序关闭任务,但不再接受新任务。
  26. shutdownNow() :尝试取消、停止所有任务,并拒绝所有随后提交的任务。
  27. toString() :返回可识别此线程池的字符串及它的状态,包括运行状态、并行级别、工作线程和任务数量。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
如果你是新手,这篇博客可能会对你有所帮助。博客的作者是B站黑马程序员的《python多线程编程》的视频的笔记摘录。博客中的代码是作者手动敲的,可以直接运行,如果有错误,作者欢迎评论指正。在博客中,有两个示例代码可以帮助你理解多线程的概念和使用方法。第一个示例是一个简单的多线程实现,其中一个线程用来唱歌,另一个线程用来跳舞。在示例代码中,使用了`threading.Thread`来创建两个线程,并分别指定了目标函数和参数。然后通过`start`方法启动线程。这样,两个线程就可以并发地执行唱歌和跳舞的任务。第二个示例代码展示了线程之间执行的顺序。在这个示例中,使用了`threading.current_thread`来获取当前线程线程对象,并打印出来。然后通过循环创建了5个子线程,并启动它们。由于多线程的执行是并发的,所以无法确定线程的执行顺序。希望这些示例代码对你理解和学习python多线程编程有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python多线程编程(详细:适合小白入门)](https://blog.csdn.net/weixin_44917390/article/details/119610760)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腹黑的乌鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值