创建线程池的七种方式为_全局线程池如何创建

创建线程池的七种方式为_全局线程池如何创建创建线程池的7种方式

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在 Java 语言中,并发编程往往都是通过床架线程池来实现的,而线程池的创建方式也有很多种,每种线程池的创建方式都对应了不同的使用场景。总结来说线程池的创建可以分为两大类:

通过 Executors 创建

通过 ThreadPoolExecutor 创建

以上这两类创建线程池的方式有 7 种具体实现方法,这 7 种方法便是本文要说的创建线程池的七种方式。分别是:

方法 含义
Executors.newFixedThreadPool() 创建一个大小固定的线程池,可控制并发的线程数,超出的线程会在队列中等待
Executors.newCachedThreadPool() 创建一个可缓存的线程池,若线程数超过处理所需,缓存一段时间后会回收,若线程数不够,则新建线程
Executors.newSingleThreadExecutor() 创建单个线程的线程池,可以保证先进先出的执行顺序
Executors.newScheduledThreadPool() 创建一个可以执行延迟任务的线程池
Executors.newSingleThreadScheduledExecutor() 创建一个单线程的可以执行延迟任务的线程池
Executors.newWorkStealingPool() 创建一个抢占式执行的线程池
ThreadPoolExecutor() 手动创建线程池,可自定义相关参数

Executors.newFixedThreadPool():创建一个固定大小的线程池,可控制并发的线程数。

public class FixedThreadPoolDemo {

    public static void main(String[] args) {

        // 创建 2 个线程的线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(2);
        // 创建任务
        Runnable runnable = () -> System.out.println("任务被执行,线程:" + Thread.currentThread().getName());
        // 线程池执行任务(一次添加 8 个任务)
        threadPool.execute(runnable);
        threadPool.execute(runnable);
        threadPool.execute(runnable);
        threadPool.execute(runnable);
        threadPool.execute(runnable);
        threadPool.execute(runnable);
        threadPool.execute(runnable);
        threadPool.execute(runnable);
    }

}

创建一个具有 2 个线程的线程池,执行 8 个任务,执行结果为:

创建线程池的七种方式为_全局线程池如何创建

Executors.newCachedThreadPool():创建一个可缓存的线程池,若线程数超过人物所需,那么多余的线程会被缓存一段时间后再回收,若线程数不够,则会新建线程。

public class CachedThreadPoolDemo {

    public static void main(String[] args) {

        // 创建线程池
        ExecutorService threadPool = Executors.newCachedThreadPool();
        // 执行任务
        for (int i = 0; i < 5; i++) {
            threadPool.execute(() -> {
                System.out.println("任务被执行,线程:" + Thread.currentThread().getName());
            });
        }
    }

}

创建了一个具有 5 个线程的线程池来执行相应的任务。

创建线程池的七种方式为_全局线程池如何创建

使用场景

CachedThreadPool 是根据短时间的任务量来决定创建的线程数量的,所以它适合短时间内有突发大量任务的处理场景。

Executors.newSingleThreadExecutor():创建只有单个线程的线程池,可以保证先进先出的顺序。

public class SingleThreadExecutorDemo {

    public static void main(String[] args) {

        // 创建线程池
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        // 执行任务
        for (int i = 0; i < 10; i++) {
            int index = i;
            threadPool.execute(() -> {
                System.out.println(index + ": 任务被执行: " + Thread.currentThread().getName());
            });
        }
    }

}

创建线程池的七种方式为_全局线程池如何创建

如果在打印语句下再加一行睡眠的语句,就会看到每个一段时间输出任务被执行的过程~

try {
    TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
    e.printStackTrace();
}

Executors.newScheduledThreadPool():创建一个可以执行延迟任务的线程池。

public class ScheduledThreadPoolDemo {

    public static void main(String[] args) {
        // 创建线程池
        ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(5);
        // 添加定时执行任务(1s 后执行)
        System.out.println("添加任务,时间:" + new Date());
        threadPool.schedule(() -> {
            System.out.println("任务被执行,时间:" + new Date());
        }, 2, TimeUnit.SECONDS);
    }

}

创建一个延迟 2 秒执行任务的线程池。

创建线程池的七种方式为_全局线程池如何创建

Executors.newSingleThreadScheduledExecutor():创建一个单线程的可以执行延迟任务的线程池。这种线程池可以看做是 ScheduledThreadPool 的单线程版本。

public class SingleThreadScheduledExecutorDemo {

    public static void main(String[] args) {
        // 创建线程池
        ScheduledExecutorService threadPool = Executors.newSingleThreadScheduledExecutor();
        // 添加定时执行任务(2s 后执行)
        System.out.println("添加任务,时间:" + new Date());
        threadPool.schedule(() -> {
            System.out.println("任务被执行,时间:" + new Date());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
            }
        }, 2, TimeUnit.SECONDS);
    }

}

创建线程池的七种方式为_全局线程池如何创建

Executors.newWorkStealingPool():创建一个抢占式执行的线程池,执行任务的顺序不确定。需要注意的是此方法是 JDK 1.8 版本新增的,所以 1.8 版本之前的程序中不能使用。

public class WorkStealingPoolDemo {

    public static void main(String[] args) {
        // 创建线程池
        ExecutorService threadPool = Executors.newWorkStealingPool();
        // 执行任务
        for (int i = 0; i < 10; i++) {
            final int index = i;
            threadPool.execute(() -> {
                System.out.println(index + " 被执行,线程名:" + Thread.currentThread().getName());
            });
        }
        // 确保任务执行完成
        while (!threadPool.isTerminated()) {
        }
    }

}

需注意与 SingleThreadExecutor 单个线程的线程池的比较。

创建线程池的七种方式为_全局线程池如何创建

可以看到,任务的执行顺序并不是确定的,因为这是抢占式的线程池,哪个任务抢到,哪个任务先执行。

ThreadPoolExecutor():这是最原始,也是最推荐的手动创建线程池的方法。创建时支持自定义某些属性,比如核心线程数、最大线程数等。

public class ThreadPoolExecutorDemo {

    public static void main(String[] args) {

        // 创建线程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(10));
        // 执行任务
        for (int i = 0; i < 10; i++) {
            final int index = i;
            threadPool.execute(() -> {
                System.out.println(index + " 被执行,线程名:" + Thread.currentThread().getName());
            });
        }
    }

}

创建一个具有 10 个核心线程、最大线程数为 10 的线程池。具体可设置的参数请参考:线程池七大参数_文丑颜不良啊的博客-CSDN博客

创建线程池的七种方式为_全局线程池如何创建

本文参考自:Java 中线程池的 7 种创建方式! – 掘金

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/187050.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Centos8 部署Promethus(普罗米修斯)+grafana画图「建议收藏」

    Centos8 部署Promethus(普罗米修斯)+grafana画图「建议收藏」文章目录1.普罗米修斯概述2.时间序列数据2.1.普罗米修斯概述Prometheus(由go语言(golang)开发)是一套开源的监控&报警&时间序列数据库的组合。适合监控docker容器。2.时间序列数据什么是序列数据时间序列数据(TimeSeriesData):按照时间顺序记录系统、设备状态变化的数据被称为时序数据。应用的场景很多,如:气候的变化某一个地区的各车辆的行驶轨迹数据传统证券行业实时交易数据实时运维监控数据等时间序列数据特点

  • Sublime Text3 搭建python环境「建议收藏」

    Sublime Text3 搭建python环境「建议收藏」一.安装sublimeSublimeText:一款具有代码高亮、语法提示、自动完成且反应快速的编辑器软件,不仅具有华丽的界面,还支持插件扩展机制,最重要的是非常的轻便。sublimeTexe3下载地址:http://www.sublimetext.com/3二.安装packageControlSublimetext是通过packagecontrol来对插件进行安装和卸载。…

  • 串口数据读取和动态显示Tkinter+matplotlib+pyqtgraph(详细教程)

    串口数据读取和动态显示Tkinter+matplotlib+pyqtgraph(详细教程)

  • 海贼王最新漫画图片_海贼王漫画52pk

    海贼王最新漫画图片_海贼王漫画52pk制作工具模块-隐藏身份信息的User-Agent模块;对象服务器识别不了身份信息。importrandomuser_agent_data=[{“User-Agent”:”Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/65.0.3314.0Safari/537.36SE2.XMetaSr1.0″},{“Use

  • WINDOWS 1.0模拟器_modelsim激活成功教程版安装教程

    WINDOWS 1.0模拟器_modelsim激活成功教程版安装教程本教程包括软件下载、激活成功教程文件下载、安装激活成功教程方法,助你一次成功。 软件安装好了却不能用,想必大家都有过这样的痛苦和无奈。这款软件的激活成功教程花了我整整一个下午的时间,期间在网上找了各种方法尝试均以失

  • 关于安装busybox问题

    关于安装busybox问题我的手机是小米5安装busybox1.首先要手机要root2.然后下载busybox安装器(这个容易找)3.解锁system分区(可以下载syslock,这软件可以解锁system文件)点击下载syslock如果不下载system,会安装失败;4.解锁重启后就可以安装了…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号