`
DemoGilbete
  • 浏览: 5710 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java线程池总结

阅读更多
  假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。当T1 + T3 远大于 T2时,采用多线程技术可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。

    线程池就是一个线程的容器,每次只执行额定数量的线程, 线程池作用就是限制系统中执行线程的数量。采用线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目。

    为什么要用线程池:

    1)减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务

    2)可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)

      Java1.5之后,Java 提供了自己的线程池ThreadPoolExecutor类。



ThreadPoolExecutor使用简介



线程池类为java.util.concurrent.ThreadPoolExecutor,常用构造方法为:

public ThreadPoolExecutor( 

            int corePoolSize, 

            int maximumPoolSize, 

            long keepAliveTime, 

            TimeUnit unit, 

            BlockingQueue<Runnable> workQueue)



corePoolSize 指的是保留的线程池大小。

maximumPoolSize 指的是线程池的最大大小。

keepAliveTime 指的是空闲线程结束的超时时间。

unit 是一个枚举,表示 keepAliveTime 的单位。

workQueue 表示存放任务的队列。



    一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个 Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。



线程池的工作过程如下:

1、线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。

2、当调用 execute() 方法添加一个任务时,线程池会做如下判断:

    a. 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;

    b. 如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列。

    c. 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建线程运行这个任务;

    d. 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常,告诉调用者“我不能再接受任务了”。

3、当一个线程完成任务时,它会从队列中取下一个任务来执行。

4、当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于 corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到 corePoolSize 的大小。

   这样的过程说明,并不是先加入任务就一定会先执行。假设队列大小为10,corePoolSize为3,maximumPoolSize 为6,那么当加入 20 个任务时,执行的顺序就是这样的:首先执行任务 1、2、3,然后任务4~13被放入队列。这时候队列满了,任务 14、15、16 会被马上执行,而任务 17~20 则会抛出异常。最终顺序是:1、2、3、14、15、16、4、5、6、7、8、9、10、11、12、13。
复制代码

下面是一个线程池使用的例子:

public class TestThreadPool { 

    public static void main(String[] args) { 

        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3, 6, 5,TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); 

         for (int i = 1; i <= 20; i++) {  

             threadPool.execute(new ThreadPoolTask()); 

             //threadPool.shutdown(); 
        } 
    } 
}


创建 ThreadPoolTask类:

public class ThreadPoolTask implements Runnable { 
    public void run() { 
        try { 
            System.out.println("开始执行任务:" + attachData);      
            Thread.sleep(100); 
        }
        catch(Exception e){ 
            e.printStackTrace(); 
        } 
    } 
}

复制代码


1、BlockingQueue 只是一个接口,常用的实现类有 LinkedBlockingQueue 和 ArrayBlockingQueue。用 LinkedBlockingQueue 的好处在于没有大小限制。这样的话,因为队列不会满,所以 execute() 不会抛出异常,而线程池中运行的线程数也永远不会超过 corePoolSize 个,keepAliveTime 参数也就没有意义了。

2、shutdown() 方法不会阻塞。调用 shutdown() 方法之后,主线程就马上结束了,而线程池会继续运行直到所有任务执行完才会停止。如果不调用 shutdown() 方法,那么线程池会一直保持下去,以便随时添加新的任务。
分享到:
评论

相关推荐

    Java线程池与ThreadPoolExecutor.pdf

    Java线程池是Java并发编程中...总结来说,理解并正确使用Java线程池和ThreadPoolExecutor对于优化Java应用程序的并发性能至关重要。通过调整线程池的参数,可以平衡资源利用率和系统响应时间,从而提高整体的系统效率。

    java 线程池

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

    Java线程池.pdf

    ### Java线程池详解 #### 引言 在现代计算机科学中,线程作为轻量级的进程,已经成为操作系统和应用程序提高并发性、优化资源利用的关键技术之一。线程池,作为线程管理的一种高级机制,更是现代软件工程中不可或...

    java线程池和反射机制例子

    总结来说,Java线程池和反射机制是Java程序员必须掌握的高级特性。正确理解和使用它们,不仅可以提高程序的性能,还能增加代码的灵活性和可扩展性。在实际项目中,我们应该根据具体需求灵活运用这些技术,以实现高效...

    自定义实现Java线程池1-模拟jdk线程池执行流程1

    总结来说,自定义Java线程池的实现涉及到线程的管理和调度,包括核心线程的维护、任务队列的使用以及拒绝策略的设定。理解这些机制有助于我们更好地优化并发程序,提高系统效率。然而,在实际开发中,通常推荐使用...

    在spring boot中使用java线程池ExecutorService的讲解

    在 Spring Boot 中使用 Java 线程池 ExecutorService 的讲解 Spring Boot 作为一个流行的 Java 框架,提供了许多便捷的功能来帮助开发者快速构建应用程序。其中之一就是使用 Java 线程池 ExecutorService 来管理...

    自定义实现Java线程池2-完善异常处理和去除同步1

    总结起来,完善自定义线程池的异常处理和去除同步主要包括以下步骤: 1. 在`Worker`的`run`方法中捕获并处理任务执行的异常。 2. 使用原子操作类(如`AtomicInteger`)替换`synchronized`关键字,以减少锁的使用,...

    tcp_thread_java.zip_Java 线程池_java TCP线程

    Java线程池是一种高效管理线程资源的工具,它能够帮助开发者有效地控制并发执行的线程数量,提高系统性能,并确保程序的稳定性和可维护性。在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`...

    java线程池

    ### Java线程池的核心概念与实现 #### 一、引言 Java线程池是一种用于管理线程的机制,能够有效提升程序的并发性能。它通过重用预先创建的线程来减少创建新线程所需的开销,同时也能有效地控制运行中的线程数量。...

    Zz: java 线程池设计思想

    Java线程池是一种高效管理...总结来说,Java线程池通过合理的线程管理和任务调度,实现了对系统资源的有效利用,提升了程序的并发性能。理解并掌握线程池的设计思想和使用技巧,有助于编写出更高效、稳定的并发程序。

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

    总结,本项目“基于Java线程池技术的数据爬虫设计与实现”旨在通过Java编程,利用线程池的优势,实现一个高效、稳定、可扩展的数据爬虫。这涵盖了多线程编程、网络通信、HTML解析、数据存储等多个IT领域的知识点,...

    JAVA线程池应用.pptx

    ### JAVA线程池应用知识点详解 #### 一、Java线程池概述 线程池是Java多线程编程中的一个重要概念。它通过管理一组多线程的方式,为应用程序提供了一种更加灵活高效的线程管理机制。相比于直接创建线程,使用线程池...

    Java8并行流中自定义线程池操作示例

    Java8并行流中自定义线程池操作示例 Java8并行流中自定义线程池操作示例主要介绍了Java8并行流中自定义线程池操作,结合实例形式分析了并行流的相关概念、定义及自定义线程池的相关操作技巧。 1. 概览 Java8引入了...

    Java 线程池框架核心代码分析1

    总结,Java线程池通过`ThreadPoolExecutor`提供了一种高效管理线程的机制,通过配置核心参数和选择合适的线程池模型,可以优化系统的资源利用和任务调度,提高系统性能。理解线程池的工作原理和核心代码对于编写高效...

    Java线程池,正式上线运行的源码,分享欢迎使用并提意见

    总结来说,Java线程池是通过合理管理线程资源来提高并发性能的重要工具。理解线程池的参数、工作流程以及源码可以帮助我们更好地优化程序,提高系统效率。在阅读源码时,重点关注`ThreadPoolExecutor`类及其内部类,...

    Android java 线程池

    总结,Java线程池是Android应用优化并发处理的重要工具。正确地配置和使用线程池,能够提高应用性能,降低内存占用,并使任务调度更加灵活高效。在实践中,开发者需要根据应用特性来调整线程池参数,确保其适应各种...

    Java线程池的原理及几类线程池的介绍.docx

    ### Java线程池的原理及几类线程池的介绍 #### 一、线程池的概念与作用 在计算机编程中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。Java语言支持多线程编程,使得...

    如何合理估算 Java 线程池大小:综合指南.pdf

    总结来说,合理估算Java线程池的大小是一门艺术,需要综合考虑多种因素,包括系统资源、任务性质、服务限制等。只有精确地匹配这些因素,才能最大化线程池的效率,确保应用程序在高并发场景下表现良好。同时,持续...

    _JAVA线程池介绍以及简单实例.doc

    Java线程池是一种高效利用系统资源的机制,它允许开发者预先配置一定数量的线程,以便在处理任务时能够快速响应。线程池的核心概念在于避免频繁地创建和销毁线程,这可以显著减少系统开销,提升整体性能。本文将深入...

Global site tag (gtag.js) - Google Analytics