`

Java处理http协议相关初步(三)——线程池的使用分析

 
阅读更多
接着上篇说,好歹上面也加了个线程池,用好这概念,还是有些难度的,更不要说提出这些概念的人。可是看着看着发现技术又跟我前面记录的一样,是个熟悉的过程,我们逃脱不了技术工人,我不是个合格的,因为让我从无到有的写代码,我是一点都写不出来的,O(∩_∩)O~,不过技术在手里,用在哪里就看你了,要有希望,要有激情。今天扯远啦。
先从简单的并发的线程说起,一般实现线程都是实现Runnable接口或继承Thread类,后面又有了执行器(Executor)接口,其只有一个方法就是execute(Runnable command),其后有ExecutorService以及ScheduledExecutorService接口,对应的实现的类有ThreadPoolExecutor和ScheduledThreadExecutor,这样,Executor提供了一个简单的标准化接口,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。根据所使用的具体 Executor 类的不同,可能在新创建的线程中,现有的任务执行线程中,或者调用 execute() 的线程中执行任务,并且可能顺序或并发执行。可以从软件包 java.util.concurrent 的描述中看到这些实用的工具包对并发的支持。(下面简单的提一下,详细的应该查看标准文档)
(1)ExecutorService(接口):具有involveAll/invokeAny,shutdown,submit,完成批量或单独的任务提交,以及任务的终止等。
(2)ScheduledExecutorService(接口):可安排在给定的延迟运行或定期执行命令:schedule(),scheduleAtFixedRate(),scheduleWithFixDelay等。
再说回线程池,以ThreadPoolExecutor为例,也就是前面用到得。举例说明之前其实要说的是,如果没有特别的要求,最好使用Executors来创建需要的线程池,它会很好的处理线程池中线程的维护,任务的排队等等,如newCachedThreadPool() 创建一个可根据需要创建新线程的线程池,适合于短连接,处理轻任务的情况 ,newFixedThreadPool(int nThreads) 则是创建具有可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。如果真要自己来维护,那么就要考虑几个问题就是,线程池要维持多少个常在(预先开启的,即使没有在处理任务也依然存在的)线程,最大开启多少线程(也可以无限,直到资源耗尽),当现有线程比规定的常在线程数多时,它们该怎么处理;当有大量的任务请求到时,来不及处理的任务需要排队还是抛弃等等;我们可以先看看ThreadPoolExecutor的其中一个构造函数ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler),从中看到有到核心和最大池大小,保持活动时间,排队的三种通用策略,被拒绝的任务的处理等等,我就不细说了。下面看例子


如果直接运行的话,会发现当任务数达到corePoolSize规定的之后,新提交的任务就得不到执行,也是上篇说的新的请求得不到运行,可是任务队列也没有满,这是什么原因的:查看了实现的源码之后才知道,ThreadPoolExecutor的execute方法中(针对例子中使用的那个构造函数),当线程数达到corePoolSize时,新任务入队,但是只有当队伍满时或者旧有的线程运行完后才会处理队列中的任务。好了,说到这里。因此不是有特别要求还是用Executors来创建比较好。最后想说,有源码看还是很不错的,容易发现问题的所在。
分享到:
评论

相关推荐

    java线程池使用后到底要关闭吗

    java线程池使用后到底要关闭吗 java线程池是一种高效的并发编程技术,可以帮助开发者更好地管理线程资源,提高系统的性能和可靠性。然而,在使用java线程池时,一个常见的问题是:使用完线程池后到底要不要关闭?...

    java技术学习-基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分)

    java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java线程池技术实现Knock Knock游戏项目(包含服务端、客户端两部分) java技术学习——基于Java...

    Java全能学习面试手册——互联网企业面试真题.zip

    Java全能学习面试手册——互联网企业面试真题.zip 01 java面试——北京-百度-Java中级.pdf 02 java面试——北京-京东-Java中级.pdf 03 java面试——广州-唯品会-Java大数据开发工程师.pdf 04 java面试——杭州-阿里...

    Java实现通用线程池

    Java 实现通用线程池是指使用 Java 语言编写一个通用的线程池,线程池通俗的描述就是预先创建若干空闲线程,等到需要用多线程去处理事务的时候去唤醒某些空闲线程执行处理任务,这样就省去了频繁创建线程的时间,...

    一个通用的Java线程池类

    环境:Windows XP ...这里本人翻写一个通用的线程池类,它可以用来作为工具类处理许多多线程问题。代码注释非常详尽,一行注释一行代码。 阅读对象:非常熟悉Java的基本概念,并且熟悉命令行编写代码的人员。

    计算机算法——设计与分析导论(第三版).pdf

    综上所述,本书《计算机算法——设计与分析导论》通过介绍算法的基本概念、分析算法的方式、使用数学背景来描述算法性能,以及提供具体的算法实例,为读者提供了一个全面了解计算机算法设计与分析的框架。...

    利用Java进行疫情大数据分析——“Java面向对象程序设计”课程实践教学设计研究.pdf

    利用Java进行疫情大数据分析——“Java面向对象程序设计”课程实践教学设计研究.pdf

    JAVA线程池的分析和使用

    - **RejectedExecutionHandler**:饱和策略,处理线程池饱和时的新任务。 3. **线程池的执行策略** - **AbortPolicy**:默认策略,抛出`RejectedExecutionException`异常。 - **CallerRunsPolicy**:调用者线程...

    聊聊并发(3)Java线程池的分析和使用Java开发Jav

    在Java编程中,线程池是一种管理线程资源的有效方式,它可以提高...在阅读《聊聊并发(3)Java线程池的分析和使用》这份文档时,你可以学习到更多关于线程池的实践技巧和案例分析,这对于提升Java开发能力大有裨益。

    Java/Android线程池演示Demo

    本Demo主要展示了如何在Java或Android环境中使用线程池,以下是对相关知识点的详细解释: 一、线程池概念 线程池是由多个工作线程组成的集合,它可以预先创建一定数量的线程,当有任务需要执行时,从池中取出一个...

    JAVA学习笔记————————

    7. **多线程**:JAVA提供了丰富的多线程支持,学习笔记会讲解线程的创建、同步、互斥以及线程池的使用。 8. **反射机制**:JAVA反射机制允许在运行时动态地获取类的信息并操作类的对象,这对于插件开发、动态代理等...

    java程序设计大作业-雷电飞机射击游戏(Java)

    java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大...

    JAVA程序与PLC通信——学习使用

    本篇将详细探讨"JAVA程序与PLC通信——学习使用"这一主题,包括如何使用Java实现与西门子PLC的串口通信,以及如何收发数据。 首先,我们要理解Java语言的优势。Java作为一种跨平台的编程语言,其强大的网络支持和...

    java线程池实例详细讲解

    总之,Java线程池是实现多线程并行处理的关键工具,理解和熟练使用它可以显著提高程序的并发性能,降低系统的资源消耗。通过深入学习和实践,我们可以更好地利用线程池来优化我们的Java应用程序。

    java线程池的使用方式

    ### Java线程池的使用方式 #### 一、简介 线程在Java中扮演着至关重要的角色。在早期的JDK版本(如JDK 1.4及之前)中,线程池的功能相对简单,使用起来不够灵活。然而,自JDK 1.5开始,随着`java.util.concurrent`...

    Java线程池使用说明

    Java线程池使用说明: 一 简介 二:线程池 三:ThreadPoolExecutor详解

    Java版线程池实现

    不过,上述代码展示的是一个自定义的线程池实现,它可能没有使用Java标准库中的`ExecutorService`。 这个自定义线程池的实现包括以下几个关键组件: 1. **线程池参数**: - `reserve`:保留线程数,这些线程不...

    Java实现的线程池、消息队列功能

    标题中的“Java实现的线程池、消息队列功能”是指在Java编程中,如何利用编程技术实现线程池和消息队列这两种重要的并发处理机制。线程池和消息队列是解决多线程环境下资源管理和任务调度的有效手段,它们在高并发、...

    自定义实现Java线程池

    ### 自定义实现Java线程池 #### 一、概述 在深入探讨自定义Java线程池之前,我们先简要回顾一下线程池的基本概念及其重要性。线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动...

    java简明教程(第4版)——皮德常版.zip

    《Java简明教程(第4版)——皮德常版》是针对初学者和有一定基础的程序员设计的一份详尽的Java学习资源包。这份压缩文件包含三个主要部分:源码、课件PPT和课后习题答案,旨在帮助学习者通过实践和理论结合的方式...

Global site tag (gtag.js) - Google Analytics