Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。
下面这张图完整描述了线程池的类体系结构。
首先Executor的execute方法只是执行一个Runnable的任务,当然了从某种角度上将最后的实现类也是在线程中启动此任务的。根据线程池的执行策略最后这个任务可能在新的线程中执行,或者线程池中的某个线程,甚至是调用者线程中执行(相当于直接运行Runnable的run方法)。这点在后面会详细说明。
ExecutorService在Executor的基础上增加了一些方法,其中有两个核心的方法:
- Future<?> submit(Runnable task)
- <T> Future<T> submit(Callable<T> task)
这两个方法都是向线程池中提交任务,它们的区别在于Runnable在执行完毕后没有结果,Callable执行完毕后有一个结果。这在多个线程中传递状态和结果是非常有用的。另外他们的相同点在于都返回一个Future对象。Future对象可以阻塞线程直到运行完毕(获取结果,如果有的话),也可以取消任务执行,当然也能够检测任务是否被取消或者是否执行完毕。
在没有Future之前我们检测一个线程是否执行完毕通常使用Thread.join()或者用一个死循环加状态位来描述线程执行完毕。现在有了更好的方法能够阻塞线程,检测任务执行完毕甚至取消执行中或者未开始执行的任务。
ScheduledExecutorService描述的功能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。这包括延迟时间一次性执行、延迟时间周期性执行以及固定延迟时间周期性执行等。当然了继承ExecutorService的ScheduledExecutorService拥有ExecutorService的全部特性。
ThreadPoolExecutor是ExecutorService的默认实现,其中的配置、策略也是比较复杂的,在后面的章节中会有详细的分析。
ScheduledThreadPoolExecutor是继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现,在后面的章节中会有详细的分析。
这里需要稍微提一下的是CompletionService接口,它是用于描述顺序获取执行结果的一个线程池包装器。它依赖一个具体的线程池调度,但是能够根据任务的执行先后顺序得到执行结果,这在某些情况下可能提高并发效率。
要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,很有可能配置的线程池不是较优的,因此在Executors类里面提供了一些静态工厂,生成一些常用的线程池。
-
newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
-
newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
-
newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
-
newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
-
newSingleThreadExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。
在详细讲解ThreadPoolExecutor的时候会具体讨论上述参数配置后的意义和原理。
线程池是一个复杂的任务调度工具,因此它涉及到任务、线程池等的生命周期问题,在下一节中来探讨下这个问题。
本文转自www.35java.com
相关推荐
Java线程池是一种高效管理线程资源的工具,它的设计思想是基于生产者消费者模型,借鉴了工厂模式和代理模式的元素。线程池通过维护一组可重用线程,减少了创建和销毁线程的开销,提高了系统响应速度与并发处理能力。...
### Java学习资源与社区概述 在信息技术领域,Java作为一门重要的编程语言,其影响力与日俱增。对于希望深入学习Java及其相关技术的人来说,选择合适的学习资源至关重要。本文将详细介绍一系列针对不同层次学习者的...
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
该项目为“studyjava-zz”设计源码,深入探索Java编程新视野,共计包含549个文件,涵盖209个Java源代码文件、74个Git忽略文件、70个项目配置文件、68个classpath文件、66个偏好设置文件、25个Markdown文档、16个XML...
1. 肯尼迪总统的讲话假设:这是一道逻辑推理题,与Java编程技术无关,但可以考察逻辑思维能力。肯尼迪的讲话假设美国石油公司只关心利润,不顾政府的指示。 2. 专利意识与企业行为:此题考察的是对企业专利工作的...
总的来说,“zz.rar_JAVA俄罗斯方块”项目不仅涵盖了JAVA语言的基础知识,还涉及到图形用户界面、事件处理、线程控制等多个高级主题,是学习JAVA编程和游戏开发的理想实践案例。通过分析和实现这个项目,开发者不仅...
《聊天工具的Java开发:超越QQ,天翔ZZ》 在IT行业中,开发一款聊天工具是一项挑战性十足的..."天翔ZZ"作为一个实例,展示了如何用Java语言构建一个能够挑战QQ的聊天工具,其设计和实现策略值得开发者深入研究和学习。
### Java集合类总结 在Java开发中,集合类(Containers)是极其重要的组成部分,它们作为开发者日常编程不可或缺的工具,不仅让代码变得更加简洁、高效,还能显著提升程序的功能性和灵活性。本文将对Java标准类库中...
"zz牌类小游戏24点" 是一个基于Java编程语言开发的桌面游戏,其核心玩法是24点游戏。24点游戏是一种流行的心算游戏,玩家需要利用四张给出的扑克牌上的数字,通过加、减、乘、除运算,使得结果等于24。这个游戏旨在...
对于希望深入学习Java游戏开发的读者来说,以下是一些推荐的学习资源: 1. **官方文档**:Java官方文档是学习Java基础知识的最佳资源。 2. **在线教程**:互联网上有许多免费或付费的Java游戏开发教程,涵盖了从...
总结,Java学习涉及广泛的主题,从基本语法到高级特性,如多线程、网络编程和数据库交互。理解并熟练掌握这些概念是成为Java开发者的基石。在复习过程中,应注重实践,通过编写代码加深理解,同时遵循良好的编程规范...
《中医大夫助理信息系统 zz-doctor 深度解析》 中医大夫助理信息系统“zz-doctor”是一款基于Android平台的应用...对于想要学习或提升Android开发技能的人员来说,深入研究这个项目的源码无疑是一次宝贵的学习机会。
本项目的开发不仅是为了满足计算机相关专业学生的毕设需求,更是为了提供一个实战练习的平台,帮助Java学习者提升实际开发能力,理解企业级应用的开发流程和技术要点。通过参与这一项目,学生们可以更好地掌握Spring...
总结起来,这个Java实现的K近邻算法是一个基础但重要的机器学习工具,它能用于分类问题,并通过自定义距离度量和调整K值来适应不同的数据集和应用场景。在处理小规模数据集时,KNN算法效果良好,但在大规模数据集上...
综上所述,Java实现Logistic回归涉及了数据处理、模型构建、优化算法等多个方面,需要对机器学习基础理论和Java编程有一定了解。在实际项目中,我们通常会结合现有的库来简化开发过程,并注重模型的评估和调优。
Java图形界面学生签到考勤系统是一个利用MySQL数据库进行数据存储的软件应用,它专为在校学生设计,旨在简化考勤流程,...通过学习和实践这样的项目,开发者可以提升自己的综合技能,并对实际应用场景有更深入的理解。
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。
studyjava-zz Java再回首,重新探索这个精彩的世界。 斯人已去,独探索矣。 背景 从事Android移动开发4年(Java语言),因朋友想转行(铁路),需要带他转行入门。 朋友是电脑小白,没有任何编程经验,也没有学习过...
在Java中实现朴素贝叶斯算法,可以自定义数据结构和算法,或者使用现有的机器学习库,如Weka、Smile或Apache Mahout。这些库提供了现成的朴素贝叶斯分类器实现,简化了开发过程。 总结来说,Java实现朴素贝叶斯算法...