线程池简洁版

简介: 线程池简洁版

一、线程池简洁版


每个人有自己的生活方式,每个人有自己对待感情的态度

1.1 概念

使用线程池的好处

  • 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的销耗。
  • 提高响应速度。当任务到达时,任务可以不需要等待线程创建就能立即执行。
  • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会销耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

1.2 线程池的主要处理流程

这几张图先看一下,打个照面,等会读完再回来看下,会有意想不到的收货额

hreadPoolExecutor执行示意图

1.3 线程池的使用

1.3.1 概述

首先,Java中的线程池是通过Executor框架实现的,该框架中用到了ExecutorExecutorsExecutorService,ThreadPoolExecutor这几个类

1.3.2 三种创建方式

//执行长期任务性能好,创建一个线程池,一池有N个固定的线程,有固定线程数的线程
ExecutorService threadPool = Executors.newFixedThreadPool(5); 
//一个任务一个任务的执行,一池一线程
ExecutorService threadPool = Executors.newSingleThreadExecutor(); 
//执行很多短期异步任务,线程池根据需要创建新线程,
//但在先前构建的线程可用时将重用它们。可扩容,遇强则强
ExecutorService threadPool = Executors.newCachedThreadPool(); 

小案例

private static void threadPoolDemo() {
        ExecutorService threadPool = Executors.newFixedThreadPool(5); //一池 5 个线程
//        ExecutorService threadPool = Executors.newSingleThreadExecutor(); //
//        ExecutorService threadPool = Executors.newCachedThreadPool();
        // 池化技术使用后需要释放
        try {
            // 模拟 10个顾客办理业务,目前池子有 5个工作线程提高服务
            for (int i = 1; i <= 10; i++) {
                try { TimeUnit.SECONDS.sleep(1); }catch (InterruptedException e){ e.printStackTrace(); }
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务");
                });
                // try { TimeUnit.SECONDS.sleep(4); }catch (InterruptedException e){ e.printStackTrace(); }
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPool.shutdown();
        }
    }

1.3.3 使用 ThreadPoolExecutor创建

先放代码,现在看不懂先看下面的

public static void main(String[] args) {
//        threadPoolDemo();
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,
                5,
                2L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        try {
            for(int i=1;i<=8;i++){
//                TimeUnit.SECONDS.sleep(1);
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+"\t 办理业务");
                });
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            threadPool.shutdown();
        }
    }

1.4 线程池的7种参数

我们查阅底层源码可知ThreadPoolExecutor的构造方法有七个参数,这个参数是按照ThreadPoolExecutor里面的参数顺序来写的

参数名 解释
corePoolSize 线程池中的常驻核心线程数
maximumPoolSize 线程池中能够容纳同时执行的最大线程数,此值必须大于等于1
keepAliveTime 多余的空闲线程的存活时间
当前池中线程数量超过corePoolSize时,当空闲时间
达到keepAliveTime时,多余线程会被销毁直到
只剩下corePoolSize个线程为止
unit keepAliveTime的单位
workQueue 任务队列,被提交但未被执行的任务
threadFactory 表示生成线程池中工作线程的线程工厂,用于创建线程,一般默认的即可
handler 拒绝策略,表示当队列满了,并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝请求执行的runnable的策略

1.5 用哪一个线程池

前面1.3中说了有三种创建方式,那么我们在实际开发中,用哪一个比较好呢?

答案是:都不用

我们只使用自定义的,原因是

图中说的方式正是我们上面1.3.3中代码


目录
打赏
0
0
0
0
0
分享
相关文章
异步编程好帮手之CompletableFuture详解
异步编程好帮手之CompletableFuture详解
95 0
Java并发编程中的线程池优化技巧
在Java并发编程中,线程池扮演着至关重要的角色。本文将深入探讨如何优化Java线程池,从线程池的创建与配置、任务队列的选择、拒绝策略的制定、线程池状态的监控等多个方面进行详细阐述。通过本文的阅读,您将了解到如何合理地利用线程池,提高系统的并发性能,从而更好地应对各种并发场景。
|
9月前
|
并发编程之线程池的应用以及一些小细节的详细解析
并发编程之线程池的应用以及一些小细节的详细解析
49 0
|
5月前
|
COMATE插件实现使用线程池高级并发模型简化多线程编程
本文介绍了COMATE插件的使用,该插件通过线程池实现高级并发模型,简化了多线程编程的过程,并提供了生成结果和代码参考。
|
8月前
|
Java并发编程:深入理解线程池的设计与应用
本文旨在通过数据导向和科学严谨的方式,深入探讨Java并发编程中的关键组件——线程池。文章首先概述了线程池的基本概念与重要性,随后详细解读了线程池的核心参数及其对性能的影响,并通过实验数据支持分析结果。此外,文中还将介绍如何根据不同的应用场景选择或设计合适的线程池,以及如何避免常见的并发问题。最后,通过案例研究,展示线程池在实际应用中的优化效果,为开发人员提供实践指导。
63 0
异步编程 - 03 线程池ThreadPoolExecutor原理剖析&源码详解2
异步编程 - 03 线程池ThreadPoolExecutor原理剖析&源码详解2
76 0
异步编程 - 03 线程池ThreadPoolExecutor原理剖析&源码详解1
异步编程 - 03 线程池ThreadPoolExecutor原理剖析&源码详解
60 0