`

java 多线程(2)——线程池

 
阅读更多

一、线程池的使用背景:

网络请求通常有两种形式:

        第一种形式是请求不是很频繁,而且每次连接后会保持相当一段时间来读数据或者写数据,最后断开,如文件下载,网络流媒体等。

        第二种形式是请求频繁,但是连接上以后读/写很少量的数据就断开连接。

        考虑到服务的并发问题,如果每个请求来到以后服务都为它启动一个线程,那么这对服务的资源可能会造成很大的浪费,特别是第二种情况。因为通常情况下,创建线程是需要一定的耗时的,设这个时间为T1,而连接后读/写服务的时间为T2,当T1>>T2时,我们就应当考虑一种策略或者机制来控制,使得服务对于第二种请求方式也能在较低的功耗下完成。

        通常,我们可以用线程池来解决这个问题,首先,在服务启动的时候,我们可以启动好几个线程,并用一个容器(如线程池)来管理这些线程。当请求到来时,可以从池中去一个线程出来,执行任务(通常是对请求的响应),当任务结束后,再将这个线程放入池中备用;如果请求到来而池中没有空闲的线程,该请求需要排队等候。最后,当服务关闭时销毁该池即可。

 

 

二、线程池的使用条件:

       假设一个服务器完成一项任务所需时间为:T1 是创建线程时间,T2是线程执行任务的时间,T3是销毁线程的时间。 如果:T1 + T3 远大于 T2,则可以采用线程池的方法,以提高服务器性能。

       由此可以看出,线程池的主要作用就是减少线程的创建和销毁时间。

 

 

三、线程池的组成:

一个线程池包括以下四个基本组成部分:

 1、线程池管理器(ThreadPool):用于创建并管理线程池,包括:创建线程池、销毁线程池、添加新任务;

2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;

3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

 

 

三、线程池的类型:

1. newSingleThreadExecutor

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

2.newFixedThreadPool

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

3. newCachedThreadPool

创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,

那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

4.newScheduledThreadPool

创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。 

 

 

四、线程池的几个重要的类:

线程池有几个比较重要的几个类:

ExecutorService

真正的线程池接口。

ScheduledExecutorService

能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。

ThreadPoolExecutor

ExecutorService的默认实现。

ScheduledThreadPoolExecutor

继承ThreadPoolExecutorScheduledExecutorService接口实现,周期性任务调度的类实现。

 

1. ThreadPoolExecutor详解:

ThreadPoolExecutorExecutors类的底层实现。

ThreadPoolExecutor(

        int corePoolSize,    // 池中所保存的线程数,包括空闲线程

        int maximumPoolSize,   // 池中允许的最大线程数

        long keepAliveTime,    // 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间

        TimeUnit unit,   keepAliveTime // 参数的时间单位

        BlockingQueue<Runnable> workQueue,   // 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务

        ThreadFactory threadFactory,  // 执行程序创建新线程时使用的工厂

        RejectedExecutionHandler handler)    // 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java多线程案例——未完成

    Java多线程是Java编程中的一个重要领域,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在这个未完成的案例中,我们可能正在探讨如何在Java中创建和管理线程,以及处理多线程环境下的并发问题。下面是...

    Java多线程之定时任务 以及 SpringBoot多线程实现定时任务——异步任务

    1. SpringBoot 自定义线程池以及多线程间的异步调用(@Async、@EnableAsync) 2.Java多线程之定时任务 以及 SpringBoot多线程实现定时任务 3.@EnableScheduling 与 @Scheduled

    轻量级java多线程池demo

    本文将深入探讨一个轻量级的Java多线程池实现,这个实现允许线程间的通信,并提供了类似Akka Actor的调度功能。 首先,我们要理解Java中的线程池。线程池是一种线程使用模式,它维护一组可以重复使用的线程,避免了...

    Java多线程下载网络图片

    在Java编程中,多线程是一项关键技能,尤其在处理并发任务时,如我们的示例——"Java多线程下载网络图片"。这个场景展示了如何利用多线程技术提高程序性能,减少用户等待时间,同时优化系统资源的使用。下面我们将...

    Java多线程的小例子——吃包子

    这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...

    JAVA项目——多线程下载代码

    通过这个项目,学习者可以掌握Java多线程编程的基本概念和实际应用,了解线程池的使用,以及如何在并发环境中处理文件I/O。此外,还将锻炼到问题解决能力,如处理网络不稳定、断点续传等常见问题。对于Java程序员来...

    经典线程例子——Java线程学习指南

    Java线程是并发编程的核心部分,它允许程序同时执行多个任务,从而提高系统效率和响应速度。本指南将深入探讨Java线程的基本概念、创建方式以及管理...在学习过程中,不断编写和调试多线程程序,是提升技能的最佳途径。

    java多线程处理数据(csdn)————程序.pdf

    Java多线程处理数据是一种常见的优化策略,尤其在面临大量数据查询时,通过并发执行任务可以显著提升程序的运行效率。以下将详细解释这个程序中的关键知识点: 1. **Callable接口**:`ThredQuery`类实现了`Callable...

    java常用的代码——线程

    - **实现Callable接口并使用FutureTask**:这种方式不仅可以实现多线程,还可以获取线程执行的结果。 - **使用ExecutorService和ThreadPoolExecutor**:这是一种高级的线程池管理机制,可以有效地管理和控制线程的...

    java多线程的使用和介绍

    ### Java多线程的使用与介绍 #### 什么是多线程? 多线程是指程序能够同时执行多个线程的能力。每个线程都是一个轻量级的进程,可以在单个程序中独立运行,共享该程序的资源。在Java中,多线程是通过`java.lang....

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

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

    Java练手小项目——多线程聊天室.zip

    【Java练手小项目——多线程...通过这个“Java练手小项目——多线程聊天室”,你可以深入了解Java多线程的原理和实践,同时学习到网络编程和并发集合的运用,这对于提升你的Java编程技能和解决实际问题的能力大有裨益。

    java初学者适用——java实例大全

    最后,多线程是Java的另一大特色。Java内置了Thread类和Runnable接口,使得开发者可以编写并发程序。通过实例,初学者可以学习到如何创建和管理线程,如何同步线程以避免数据竞争,以及如何使用ExecutorService进行...

    java十大经典案例——时钟显示

    1. **Java多线程基础**: Java提供两种方式创建线程:继承`Thread`类或实现`Runnable`接口。在这个时钟显示案例中,我们可能会看到`Runnable`接口的使用,因为这样可以避免单继承的限制,更容易地实现代码复用。 2...

    Java多线程编程

    ### Java多线程编程知识点详解 #### 一、线程基础概述 - **定义与特点:** - **线程**是一种比进程更细粒度的执行单元,它允许在一个进程中并发执行多个任务。 - **轻量级进程**:线程有时被称为轻量级进程,...

    Java多线程运算集合

    ### Java多线程运算集合知识点解析 #### 一、Java多线程概念与原理 - **操作系统中的线程与进程**: - **进程**:指的是一个正在运行的应用程序,每个进程都拥有独立的内存空间。 - **线程**:是进程中的一个...

    Java课程设计 Java多线程以及图形用户界面编程详解(完整代码)

    一、Java多线程编程 多线程是Java的一个强大特性,它允许一个应用程序同时执行多个任务。在Java中,每个线程代表程序中的一个独立的执行流。通过创建和管理多个线程,开发者可以提高程序的并发性,使得程序在等待I/...

    smoker_java多线程_

    标题"smoker_java多线程_"暗示我们将探讨的是一个关于Java多线程的示例,可能是解决某个特定的并发问题。描述中提到的"实现经典多线程问题中的多线程问题"进一步说明我们将深入研究一些常见的多线程挑战,例如死锁、...

    Java多线程入门介绍.pdf

    在深入探讨Java多线程之前,我们先来了解一些基本的概念——进程与线程。 - **进程**:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位。每个进程拥有独立的地址空间和其他资源。进程之间相互独立,...

Global site tag (gtag.js) - Google Analytics