`
iceside
  • 浏览: 14138 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

【zz】java线程池学习

    博客分类:
  • java
 
阅读更多

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

分享到:
评论

相关推荐

    Zz: java 线程池设计思想

    Java线程池是一种高效管理线程资源的工具,它的设计思想是基于生产者消费者模型,借鉴了工厂模式和代理模式的元素。线程池通过维护一组可重用线程,减少了创建和销毁线程的开销,提高了系统响应速度与并发处理能力。...

    java各类学习网站及论坛

    ### Java学习资源与社区概述 在信息技术领域,Java作为一门重要的编程语言,其影响力与日俱增。对于希望深入学习Java及其相关技术的人来说,选择合适的学习资源至关重要。本文将详细介绍一系列针对不同层次学习者的...

    base zz zz zz zz

    base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz

    基于Java与HTML的studyjava-zz设计源码,深入探索Java编程新视野

    该项目为“studyjava-zz”设计源码,深入探索Java编程新视野,共计包含549个文件,涵盖209个Java源代码文件、74个Git忽略文件、70个项目配置文件、68个classpath文件、66个偏好设置文件、25个Markdown文档、16个XML...

    阿里巴巴java笔试zz.

    在IT行业,尤其是软件开发领域,技术的快速更新换代需要程序员不断学习新技术,并思考如何将这些技术应用到实际工作中,以推动企业或项目的进步。 对于那些看似与编程无关的小猴子的荔枝问题和上帝存在论辩这类题目...

    zz.rar_JAVA俄罗斯方块

    总的来说,“zz.rar_JAVA俄罗斯方块”项目不仅涵盖了JAVA语言的基础知识,还涉及到图形用户界面、事件处理、线程控制等多个高级主题,是学习JAVA编程和游戏开发的理想实践案例。通过分析和实现这个项目,开发者不仅...

    聊天工具的java开发 超越QQ 天翔ZZ

    《聊天工具的Java开发:超越QQ,天翔ZZ》 在IT行业中,开发一款聊天工具是一项挑战性十足的..."天翔ZZ"作为一个实例,展示了如何用Java语言构建一个能够挑战QQ的聊天工具,其设计和实现策略值得开发者深入研究和学习。

    (zz)java集合类总结

    ### Java集合类总结 在Java开发中,集合类(Containers)是极其重要的组成部分,它们作为开发者日常编程不可或缺的工具,不仅让代码变得更加简洁、高效,还能显著提升程序的功能性和灵活性。本文将对Java标准类库中...

    zz牌类小游戏24点

    "zz牌类小游戏24点" 是一个基于Java编程语言开发的桌面游戏,其核心玩法是24点游戏。24点游戏是一种流行的心算游戏,玩家需要利用四张给出的扑克牌上的数字,通过加、减、乘、除运算,使得结果等于24。这个游戏旨在...

    JAVA 从零学习用于复习

    总结,Java学习涉及广泛的主题,从基本语法到高级特性,如多线程、网络编程和数据库交互。理解并熟练掌握这些概念是成为Java开发者的基石。在复习过程中,应注重实践,通过编写代码加深理解,同时遵循良好的编程规范...

    JAVA源码Java火影忍者游戏源代码

    对于希望深入学习Java游戏开发的读者来说,以下是一些推荐的学习资源: 1. **官方文档**:Java官方文档是学习Java基础知识的最佳资源。 2. **在线教程**:互联网上有许多免费或付费的Java游戏开发教程,涵盖了从...

    中医大夫助理信息系统 zz-doctor

    《中医大夫助理信息系统 zz-doctor 深度解析》 中医大夫助理信息系统“zz-doctor”是一款基于Android平台的应用...对于想要学习或提升Android开发技能的人员来说,深入研究这个项目的源码无疑是一次宝贵的学习机会。

    基于java的招聘求职系统-886zz792.zip

    基于java的招聘求职系统_886zz792.zip

    高分springboot毕设+vue的招聘求职系统_zz-Java源码.zip

    本项目的开发不仅是为了满足计算机相关专业学生的毕设需求,更是为了提供一个实战练习的平台,帮助Java学习者提升实际开发能力,理解企业级应用的开发流程和技术要点。通过参与这一项目,学生们可以更好地掌握Spring...

    这是java实现机器学习算法中的k近邻算法

    总结起来,这个Java实现的K近邻算法是一个基础但重要的机器学习工具,它能用于分类问题,并通过自定义距离度量和调整K值来适应不同的数据集和应用场景。在处理小规模数据集时,KNN算法效果良好,但在大规模数据集上...

    java实现logistic回归算法

    综上所述,Java实现Logistic回归涉及了数据处理、模型构建、优化算法等多个方面,需要对机器学习基础理论和Java编程有一定了解。在实际项目中,我们通常会结合现有的库来简化开发过程,并注重模型的评估和调优。

    Java图形界面学生签到考勤系统MySQL数据库.zip

    Java图形界面学生签到考勤系统是一个利用MySQL数据库进行数据存储的软件应用,它专为在校学生设计,旨在简化考勤流程,...通过学习和实践这样的项目,开发者可以提升自己的综合技能,并对实际应用场景有更深入的理解。

    ZZ561401.CAB

    ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB

    wincc AX NF ZZ

    wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。

    百度地图毕业设计源码-studyjava-zz:Java再回首,重新探索这个精彩的世界

    studyjava-zz Java再回首,重新探索这个精彩的世界。 斯人已去,独探索矣。 背景 从事Android移动开发4年(Java语言),因朋友想转行(铁路),需要带他转行入门。 朋友是电脑小白,没有任何编程经验,也没有学习过...

Global site tag (gtag.js) - Google Analytics