`

Java线程池

 
阅读更多

线程池的有点
1.降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2.提高响应速度,任务可以不需要等线程创建就能立即执行。
3.提高线程可管理性,防止无限制创建导致的消耗系统资源、降低系统稳定性。使用线程池可以进行统一的分配、调优和监控。
4.使用线程池可以有效控制最大并发线程数,提高资源利用率,避免过多资源竞争,避免阻塞。
5.线程池可以提供定时执行、单线程执行、并发控制等,操作线程方便。
6.new Thread不能重复使用,new 相当于在内存中单独开辟一个内存让线程运行,需要释放线程和新建线程,性能差。使用线程池,可以减少对象的创建、消亡的开销。

 

线程池简介

Java中,线程池的概念是Executor这个接口,具体实现为ThreadPoolExecutor类。对线程池的配置,就是对ThreadPoolExecutor构造函数的参数配置。
ThreadPoolExecutor提供了四个构造函数:

 ThreadPoolExecutor策略:

1.线程数量未达到corePoolSize,新建一个线程(核心线程)执行任务
2.线程数量达到corePoolSize,则任务加入列等待。
3.队列已满,新建线程(非核心线程)执行任务。
4.队列已满,总线程数又达到maximumPoolSize,抛出异常。

 

ThreadPoolExecutor的参数和方法

corePoolSize:核心线程数量。当线程数少于corePoolSize的时候,直接创建新的线程,尽管其他的线程是空闲的。当线程池中的线程数目达到corePoolSize后,会把到达的任务放到缓存队列中。
maximunPoolSize:线程池最大线程数。线程数少于线程最大数目且大于核心线程数目的时候,只有当阻塞队列满了才创建新线程。当线程数量大于最大线程数目且阻塞队列满了是会执行一些策略来影响该线程。
workQueue:阻塞队列,存储等待执行的任务。当所有核心线程都执行时,新增加任务会被添加到这个队列中等待处理,如果队列满了,则新建非核心线程执行。
常用workQueue类型:
SynchronousQueue:接收任务后直接给线程处理,如果线程都在工作,就创建新线程。为了不保证达到最大线程数,maximumPoolSize一般指定无限大。
LinkedBlockingQueue:当线程数小于核心线程数则新建线程,如果等于核心线程数,则进入等待队列,由于队列没有最大限制,即所有超过线程线程数的线程都被添加到该队列中,导致maximumPoolSize设定失效。
ArrayBlockingQueue:可限定队列长度,如果没有达到核心线程数,则新建核心线程,如果达到了,则入队等候,如果队列已满,则新建线程(非核心线程),如果达到最大限制数,并且队列也满了,则发生错误。
DelayQueue:队列元素必须实现Delayed接口,队列接收任务时,首先先入队,达到指定延时时间才会执行。

keepAliveTime:非核心线程没有任务执行最多保持多久时间终止。
allowCoreThreadTimeOut=true:上面的时间作用于核心线程。
unit:keepAliveTime的时间单位
threadFactory:线程工厂,用来创建线程。使用默认工厂创建线程时,线程具有相同的优先级。
handler:拒绝策略。
execute();添加任务。
submit();提交任务,返回execute+Future。
invokeAll();方法接收一个list<Callable>,当全部任务都执行完成后返回List<Future<T>>,并且能保证请求和返回值的顺序是一致的。
shutdown();关闭线程池,等待任务都执行完。
shutdownNow();关闭线程池,不等待任务执行完。
getTaskCount();线程池已执行和未执行的任务总数。
getCompletedTaskCount();已完成的任务数量。
getPoolSize();当前线程数量。
getActiveCount();正在执行任务的线程数量。

 

Executor线程池创建的四种线程
1. newFixedThreadPool:创建的是定长的线程池,可以控制线程最大并发数,超出的线程会等待,使用无界队列,核心线程数和最大线程数一样,当线程没有任务时立刻销毁。
2. newSingleThreadExecutor:创建的是单线程化的线程池,只会用唯一一个线程执行,可以指定是否按照先入先出,还是优先级来执行。是无界队列,核心线程数和最大线程数都是1个。
3. newCachedThreadPool:设定一个可缓存的线程池,当线程池长度超过处理的需要,可以灵活回收空闲线程,如果没有可回收才创建新线程。没有核心线程数,当线程没任务60s后就会回收空闲线程,有界队列。
4. newScheduledThreadPool:支持线程定时操作和周期性操作。


常用四种线程池方法

CachedThreadPool()
可缓存线程池:
1.线程数无限制
2.有空闲则复用空闲线程,若无空闲线程则新建线程。
3.一定程序减少频繁创建/销毁线程,减少系统开销。
创建方法:ExccutorServicecachedThreadPool=Executors.newCachedThreadPool();

FixedThreadPool()
定长线程池:
1.可控制线程最大并发数。
2.超出的线程会在队列中等待。
创建方法:
ExecutorService fixedThreadPool=Executors.newFixedThreadPool(int maximumPoolSize);

ScheduledThreadPool()
定长线程池
执行定时及周期性任务执行。
ExecutorServicescheduledThreadPool=Executors.newScheduledThreadPool(int corePoolSize);

SingleThreadExecutor()
单线程化的线程池
1.仅有一个线程执行任务
2.所有任务按照指定顺序执行,遵循队列的入队出队规则。
创建方法:
ExecutorServicesingleThreadPool=Executor.newSingleThreadPool();

 

使用例子

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(15);
fixedThreadPool.submit(() -> {
    System.out.println("test");               
}));
ThreadPoolExecutor threadPoolExecutor=new ThreadPoolExecutor(
    8,
    maxPoolSize,
    keepAlive,
    TimeUnit.SECONDS,
    new SynchronousQueue<>(),
    new ThreadFactoryBuilder().setNamePrefix("text-").build());
threadPoolExecutor.invokeAll(new LinkedList<Callable<Object>>(), 3, TimeUnit.MINUTES);

 

分享到:
评论

相关推荐

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

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

    java线程池完整代码

    "Java 线程池完整代码解析" Java 线程池是 Java 语言中的一个重要概念,它允许开发者创建和管理多个线程,以提高程序的并发性和性能。下面是对给定文件的解析,包括 title、description、标签和部分内容的解析。 ...

    java线程池封装j

    Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,根据任务的需要灵活调度,而不是每次需要执行任务时都创建新的线程。这种设计模式大大提高了系统的性能,减少了系统资源的消耗,特别是在高并发...

    java线程池实例详细讲解

    Java线程池是一种高效管理线程资源的工具,它能够帮助开发者有效地控制并调度线程,从而提升系统性能,减少系统资源的浪费。在Java中,`ExecutorService`接口是线程池的主要入口,它是`java.util.concurrent`包的一...

    java线程池知识.ppt

    java线程池知识、

    Java线程池使用说明

    Java线程池是Java并发编程中的重要组件,它能够有效地管理和复用线程,从而提高程序的执行效率和降低资源消耗。在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,...

    自定义实现Java线程池

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

    java线程池的源码分析.zip

    Java线程池是Java并发编程中的重要组成部分,它在多线程和高并发场景下扮演着关键角色。本文将深入探讨Java线程池的源码分析,并对比不同类型的线程池,以帮助开发者更好地理解和利用这一强大的工具。 首先,我们要...

    Java 线程池.docx

    Java线程池是一种高效管理线程资源的工具,它的出现是为了应对多线程编程中频繁创建和销毁线程带来的性能开销以及资源消耗。在Java中,通过使用线程池,我们可以预先创建一定数量的线程,这些线程在空闲时可以被复用...

    Java线程池与ThreadPoolExecutor.pdf

    Java线程池是Java并发编程中的重要组成部分,它允许开发者管理多个线程并有效地调度任务。线程池通过ThreadPoolExecutor类实现,这是一个高度可配置的工具,能够根据具体需求定制线程的创建、管理和销毁策略。 ...

    Java简单线程池 线程池中文文档

    简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类

    Java 线程池的原理与实现

    Java线程池是一种高级的多线程处理框架,它是Java并发编程中非常重要的一个组件。线程池的原理和实现涉及到操作系统调度、内存管理和并发控制等多个方面。理解线程池的工作原理有助于优化程序性能,避免过度创建和...

    一个通用的Java线程池类

    2.然后根据提示运行java命令执行示例程序,观看线程池的运行结果 目标:Java中多线程技术是一个难点,但是也是一个核心技术。因为Java本身就是一个多线程语言。本人目前在给46班讲授Swing的网络编程--使用Swing来...

    java 线程池

    ### Java线程池详解 #### 一、线程与线程池的概念 在Java中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。一个进程(例如某个Java应用)至少有一个线程,如果线程...

    java 线程池实现多并发队列后进先出

    Java线程池是一种高效管理并发任务的机制,它允许开发者预先配置一定数量的线程,以便在处理多个并发任务时能有效地复用这些线程,从而避免了频繁创建和销毁线程带来的开销。在Java中,`java.util.concurrent`包下的...

    基于Java线程池技术实现Knock Knock游戏项目.zip

    基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池技术实现Knock Knock游戏项目.zip 基于Java线程池...

    JAVA线程池的原理与实现.pdf

    Java线程池是一种高效利用系统资源、管理并发执行任务的机制。它的原理是通过预先创建一组线程,这些线程在任务到来时可以立即执行,而不是每次需要执行任务时都新建线程,从而降低了线程创建和销毁带来的开销。...

    Java线程池及观察者模式解决多线程意外死亡重启问题

    Java线程池是Java并发编程中的重要组成部分,它允许开发者高效地管理多个并发执行的线程,有效地控制系统的资源消耗,提高系统性能和稳定性。在Java中,`java.util.concurrent`包提供了`ExecutorService`接口及其...

    Java 线程池.pptx

    讲述了java线程池的优点,参数,6种线程池的使用场景,线程池用到的handler,线程任务的提交方式等等。

    基于Java线程池技术的数据爬虫设计与实现.pdf

    本文所提及的基于Java线程池技术的数据爬虫设计与实现,不仅涉及到了数据爬虫的原理和架构,还包括了多线程编程的知识点,以及线程池技术在数据爬虫中的具体应用。 首先,数据爬虫的基本原理是模拟用户的点击行为,...

Global site tag (gtag.js) - Google Analytics