Java多线程之线程池详解

  • Post author:
  • Post category:java




Java多线程之线程池详解




目录:

  1. 线程池使用及优势
  2. 线程池3个常用方式
  3. 线程池7大参数深入介绍
  4. 线程池底层工作原理



1. 线程池使用及优势


  1. 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,

    如果线程数量超过了最大数量 超出数量的 线程排队等候,等其它线程执行完毕,再从队列中取出任务来执行。
  2. 它的主要特点为:线程复用,控制最大并发数,管理线程。

优点:

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

    行统一的分配,调优和监控



2. 线程池3个常用方式


Java中的线程池是通过Executor框架实现的,该框架中用到了Executor,Executors,

ExecutorService,ThreadPoolExecutor这几个类。

线程池3个常用方式:

  1. Executors.newFixedThreadPool(int) :执行长期任务,性能好很多
  2. Executors.newSingleThreadExecutor() : 一个任务一个任务执行的场景
  3. Executors.newCachedThreadPooI() : 执行很多个短期异步的小程序或者负载较轻的服务器。

先看代码,再根据源码总结




1. Executors.newFixedThreadPool(int)


  1. Executors.newFixedThreadPool(int)概述

    在这里插入图片描述
  2. 代码验证
public class MyThreadPoolDemo {
    public static void main(String[] args) {
//        1池5个处理线程
        ExecutorService threadPool = Executors.newFixedThreadPool(5);

//        模拟10个用户来办理业务,每个用户就是一个来自外部的请求线程。
        try {
            for (int i = 1; i <= 10; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName()+"\t 办理业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}
  1. 执行结果:

    在这里插入图片描述



2. Executors.newSingleThreadExecutor()


  1. Executors.newSingleThreadExecutor()概述
    在这里插入图片描述
  2. 代码验证
public class MyThreadPoolDemo {
    public static void main(String[] args) {

        ExecutorService threadPool = Executors.newSingleThreadExecutor();

        try {
//        模拟10个用户来办理业务,每个用户就是一个来自外部的请求线程。
            for (int i = 1; i <= 10; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName()+"\t 办理业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}
  1. 执行结果:

    在这里插入图片描述



3. Executors.newCachedThreadPooI()


  1. Executors.newCachedTIyeadPooI() 概述

    在这里插入图片描述

  2. 代码验证:

public class MyThreadPoolDemo {
    public static void main(String[] args) {

        ExecutorService threadPool = Executors.newCachedThreadPool();
        
        try {
//        模拟10个用户来办理业务,每个用户就是一个来自外部的请求线程。
            for (int i = 1; i <= 10; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}
  1. 执行结果:

    在这里插入图片描述



3. 线程池7大参数深入介绍


篇幅限制,另开一篇详细说明。


Java多线程之线程池7大参数详解




4. 线程池底层工作原理

篇幅限制,另开一篇详细说明。


Java多线程之线程池底层工作原理



版权声明:本文为weixin_41910694原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。