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

创建线程池的七种方式为_全局线程池如何创建创建线程池的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 种创建方式! – 掘金

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 应对未来挑战!巨头联手开发5G路由器

    应对未来挑战!巨头联手开发5G路由器

    2022年3月5日
    42
  • 2021年全网最全最详细的SpringBoot面试题精选合集

    2021年全网最全最详细的SpringBoot面试题精选合集1.SpringBoot基础1.1什么是SpringBoot?用来简化Spring应用的初始搭建以及开发过程,使用特定的方式来进行配置 创建独立的Spring引用程序main方法运行 嵌入的tomcat无需部署war文件 简化maven配置 自动配置Spring添加对应的功能starter自动化配置>SpringBoot来简化Spring应用开发,约定大于配置,去繁化简1.2SpringBoot有哪些优点? 独立运行 SpringBoot而且内嵌了各种ser

    2022年6月7日
    79
  • Android代码混淆及调试错误「建议收藏」

    Android代码混淆及调试错误「建议收藏」Android代码混淆及调试错误

    2022年5月30日
    31
  • 一篇关于数据库的操作

    0x00了解数据库数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库是以一定方式储存在一起、能与多个用户共享、

    2021年12月11日
    41
  • JS正则表达式完整版

    JS正则表达式完整版目录引言第一章正则表达式字符匹配攻略1两种模糊匹配2.字符组3.量词4.多选分支5.案例分析第1章小结第二章正则表达式位置匹配攻略1.什么是位置呢?2.如何匹配位置呢?3.位置的特性4.相关案例第二章小结第三章正则表达式括号的作用1.分组和分支结构2.引用分组3.反向引用4.非捕获分组…

    2022年7月26日
    9
  • Burpsuite Professional安装及使用教程(抓包)

    Burpsuite Professional安装及使用教程(抓包)先从吾爱破解论坛下载工具:https://down.52pojie.cn/Tools/Network_Analyzer/Burp_Suite_Pro_v1.7.37_Loader_Keygen.zip工具运行需要Java环境,请自行安装,此处不赘述。解压完后双击keygen填一下LicenseText(随意),然后点击Run即可启动BurpSuite的主程序将keygen中得到的License复制粘贴到这里然后点击Next点击这个后出现下一个界面点击Copyreques

    2022年6月5日
    65

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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