java创建线程池的方法

news2024/11/26 14:37:24

简介

线程池是一种用于管理和重用线程的机制,它可以有效地管理线程的创建和销毁,减少线程创建和销毁的开销,并且能够控制并发线程数量,避免资源耗尽和系统过载。Java 提供了java.util.concurrent 包来支持线程池的实现。

1.ThreadPoolExecutor

ThreadPoolExecutor是一种很常用的线程池创建方法。

例如:

ThreadPoolExecutor threadPool = new ThreadPoolExecutor();

其构造方法可以有7个参数,分别为:

corePoolSize:核心线程数

maximumPoolSize:最大线程数

keepAliveTime:最大线程数可以存活的时间,单位有秒,分,小时等。

workQueue:阻塞队列,当线程池满时用来存储线程池等待执行的任务,均为线程安全,其有7种类型。

  • ArrayBlockingQueue:数组组成的有界阻塞队列。
  • LinkedBlockingQueue:链表组成的有界阻塞队列。
  • SynchronousQueue:不存储元素的阻塞队列,即直接提交给线程不保持它们。
  • PriorityBlockingQueue:支持优先级排序的无界阻塞队列。
  • DelayQueue:使用优先级队列实现的无界阻塞队列,只有在延迟期满时才能从中提取元素
  • LinkedTransferQueue:链表组成的无界阻塞队列。
  • LinkedBlockingDeque:链表组成的双向阻塞队列。

threadFactory:线程工厂,主要用来创建线程。

handler:拒绝策略,拒绝处理任务时的策略,有四种类型(默认为 AbortPolicy)

  • AbortPolicy:拒绝并抛出异常
  • DiscardPolicy:忽略并抛弃当前任务。
  • DiscardOldestPolicy:抛弃队列头部(最旧)的一个任务,并执行当前任务。
  • CallerRunsPolicy:使用当前调用的线程来执行此任务。

例子:

    public static void create01(){
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 15, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(20));
        for (int i = 0; i < 5; i++) {
            threadPool.execute(() -> {
                System.out.println("当前线程名为:" + Thread.currentThread().getName());
            });
        }
    }

2.FixedThreadPool

创建⼀个固定⼤⼩的线程池,可控制并发的线程数,超出的线程会在队列中等待.

例如:创建了一个有2个线程的线程池

 ExecutorService threadPool = Executors.newFixedThreadPool(2);

具体例子:

    public static void create02(){
        ExecutorService threadPool = Executors.newFixedThreadPool(2);
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                System.out.println("当前线程名为:" + Thread.currentThread().getName());
            }
        };
        threadPool.submit(runnable);
        threadPool.execute(runnable);
        threadPool.submit(runnable);
        threadPool.execute(runnable);
    }

最后输出如下:可以看到有两种不同的线程,因为线程数被固定为了2,因此上面执行了四个任务,其每个线程都执行了2次。

该线程池有两个提交线程的方法,分别为submit和execute

submit可以执行有返回值的任务和无返回值的任务,而execute只能执行没有返回值的任务

3.CachedThreadPool

创建⼀个可缓存的线程池,若线程数超过处理所需,缓存⼀段时间后会回收,若线程数不够,则新建线程

例子:

    public static void create03(){
        ExecutorService service = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            service.submit(() -> {
                System.out.println("当前线程名为:" + Thread.currentThread().getName());
            });
        }
    }

输出如下:创建了10个线程

4.ScheduledThread

创建一个可以执行延迟任务的线程池

例子:线程中的任务会在5s的延迟后执行

    public static void create04(){
        ScheduledExecutorService service = Executors.newScheduledThreadPool(5);
        System.out.println("任务开始前的时间:" + LocalDateTime.now());
        service.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("现在执行了任务:" + LocalDateTime.now());
            }
        },5, TimeUnit.SECONDS);
    }

5.SingleThreadExecutor

创建单个线程数的线程池,它可以保证先进先出的执行顺序

例子:

    public static void create05(){
        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 4; i++) {
            final int index = i;
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println("当前线程名为:" + Thread.currentThread().getName());
                }
            });
        }
    }

输出为:可以看到使用的都是一个线程

6.SingleThreadScheduledExecutor

同时具备上面两个线程池的特性,创建一个单线程的可以执行延迟任务的线程池。

    public static void create06(){
        ScheduledExecutorService threadPool = Executors.newSingleThreadScheduledExecutor();
        System.out.println("任务开始前的时间:" + LocalDateTime.now());
        threadPool.schedule(() -> {
            System.out.println("现在执行了任务:" + LocalDateTime.now());
        }, 2, TimeUnit.SECONDS);
    }

7.NewWorkStealingPool

创建一个抢占式执行的线程池(任务执行顺序不确定),此方法只有在 JDK 1.8以上的版本中才能使用。

例子:

    public static void create07(){
        ExecutorService threadPool = Executors.newWorkStealingPool();
        for (int i = 0; i < 5; i++) {
            threadPool.execute(() -> {
                System.out.println("线程名为:" + Thread.currentThread().getName());
            });
        }
        while (!threadPool.isTerminated()) {
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1600009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java(网络编程)

什么是网络编程? 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景&#xff1a;即时通信、网游对战、金融证券、国际贸易、邮件、等等 不管是什么场景&#xff0c;都是计算机跟计算机之间通过网络进行数据传输 Java中可以使用ja…

Qt | 事件第二节

Qt | 事件第一节书接上回 四、事件的接受和忽略 1、事件可以被接受或忽略,被接受的事件不会再传递给其他对象,被忽略的事件会被传递给其他对象处理,或者该事件被丢弃(即没有对象处理该事件) 2、使用 QEvent::accept()函数表示接受一个事件,使用 QEvent::ignore()函数表示…

fork()的一道面试题

前言&#xff1a;题源 #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> int main(void) {int i;for(i0; i<2; i){fork();printf("-");}wait(NULL);wait(NULL);return 0; }知道一点fork()这个系统…

移动硬盘盒支持PD充电:优势解析与实际应用探讨

随着科技的飞速发展&#xff0c;数据存储和传输的需求日益增长&#xff0c;移动硬盘盒作为便携式存储设备的重要载体&#xff0c;其功能和性能也在不断提升。近年来&#xff0c;越来越多的移动硬盘盒开始支持PD&#xff08;Power Delivery&#xff09;充电技术&#xff0c;这一…

【云计算】云数据中心网络(四):IPv6 网关

云数据中心网络&#xff08;四&#xff09;&#xff1a;IPv6 网关 1.什么是 IPv6 网关2.IPv6 网关设计思路3.IPv6 网关的主要应用场景3.1 IPv6 私网通信3.2 IPv6 互联网通信3.3 IPv6 互联网通信&#xff08;仅主动访问&#xff09; 1.什么是 IPv6 网关 2017 年&#xff0c;中国…

WordPress 多站点切换域名完整指南:详细步骤和注意事项

因为公司的需要&#xff0c;需要对 WordPress 多站点进行域名切换, 一开始我也找了相关的方案和教程&#xff0c;但是很可惜&#xff0c;国内这一块网上的资料几乎为0&#xff0c;所以我把实现的过程写了一篇文章分享出来&#xff0c;为后来的人铺路。 开始之前&#xff0c;先…

Linux三剑客之awk篇

目录 1、awk 1.1、awk参数 1.2、awk变量 1.3、awk分割符 1.3.1、FS 1.3.2、OFS 1.3.3、RS 1.3.4、ORS 1.3.5、NF 1.3.6、NR 1.3.7、FNR 1.3.8、FILENAME 1.3.9、ARGC与ARGV 1.4、自定义变量 1.5、printf格式化输出 1、awk 作用&#xff1a;具有强大的文本格式化…

软考 - 系统架构设计师 - 嵌入式真题

问题 1&#xff1a; &#xff08;1&#xff09;.HTML 静态化&#xff1a;可以实现对系统经常访问的页面进行静态化以提高系统访问的效率&#xff0c;但系统页面通常需要数据库中的用户信息和用户选择来动态显示&#xff0c;因此不适合采用。 HTML 静态化&#xff1a; 将动态生成…

20240416如何使用git对本地文件进行上传

0 写在前面 年前收到硕导消息要搭建一下github仓库&#xff0c;一直没倒出时间整理&#xff0c;如今终于有时间搭建&#xff0c;顺带解决出现的问题。 1 安装git 安装git这步比较简单&#xff0c;随手一搜就有很多教程。git的作用主要是一种媒介&#xff0c;连接本地主机与G…

CC工具箱使用指南:【三调三大类面积汇总表(一首歌听到卡带)】

一、简介 群友定制工具。 CC工具箱已经做了一个三大类面积汇总表&#xff0c;奈何大家的模板好像还是都有点不太一样。 群友提供的模板如下&#xff1a; 可以看到&#xff0c;这里的土地权属信息很多&#xff0c;有乡镇、村民委员会、村民小组&#xff0c;还有用地权属信息【…

Linux 指令之文件

1.开发背景 记录 linux 下对文件操作的指令 2.开发需求 记录常用的文件操作指令 3.开发环境 linux 操作系统&#xff0c;如果不支持需要查看是否存在对应的可执行文件 4.实现步骤 4.1 查找字符串 查找指定目录下包含指定的字符串 grep -rn "Timer frequency" .…

React间接实现一个动态组件逻辑

在开发一个浏览器插件的时候&#xff0c;用的plasmo框架和react支持的&#xff0c;里面使用react开发一个菜单功能&#xff0c;但是又不想使用react-router&#xff0c;所以就想着能不能使用一个很简单的方式做一个替代方案&#xff1f;那肯定是可以。 我在引入一个组件后&…

OneTab:一键收纳浏览器标签页,告别繁杂浏览

名人说&#xff1a;东边日出西边雨&#xff0c;道是无晴却有晴。——刘禹锡 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、OneTab二、主要功能三、安装方法1、Chrome应用商店&#xff08;需科学&#xff09;2…

【教学类-52-05】20240417动物数独(4宫格)黏贴卡片需要至少几张?难度1-9 打印版

作品展示&#xff1a; 背景需求&#xff1a; 实际打印的是以下代码生成的动物数独&#xff08;2*2&#xff09;学具 【教学类-52-03】20240412动物数独&#xff08;4宫格&#xff09;难度1-9 打印版-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞30次&#xff0c;收藏17次。【教…

zabbix 简单介绍 及部署

目录 一 监控软件作用 1&#xff0c;生产环境常见框架 2&#xff0c;监控软件的必要性 3&#xff0c;常见监控软件 二 zabbix 简介 1&#xff0c;zabbix 是什么 2&#xff0c;zabbix 干什么 3&#xff0c;zabbix 组件 3.1 zabbix server 3.2 zabbix agent 4&a…

Vue Router基础知识整理

Vue Router基础知识整理 1. 安装与使用&#xff08;Vue3&#xff09;安装使用 2. 配置路径别名和VSCode路径提示&#xff08;了解&#xff09;3. 使用查询字符串或路径传参query动态路由 与 params 4. router-link、定义别名、定义路由名称、编程式导航定义别名 aliasrouter-li…

由于找不到krpt.dll,无法继续执行代码的5种解决方法

在正常使用电脑的过程中&#xff0c;当尝试启动某个应用程序或者执行特定功能时&#xff0c;系统突然弹出一个错误提示窗口&#xff0c;明确指出由于缺失关键性文件——krpt.dll&#xff0c;导致当前运行的软件无法正常读取并执行相应的程序代码&#xff0c;进而无法顺利完成预…

HG泄露(ctfhub)

工具准备&#xff1a;dirsearch、dvcs-ripper 网络安全之渗透测试全套工具篇&#xff08;内含安装以及使用方法&#xff09;_dvcs-ripper-CSDN博客 dvcs-ripper&#xff1a;一款perl的版本控制软件信息泄露利用工具&#xff0c;支持bzr、cvs、git、hg、svn... tree //树状…

故障转移-redis

4.4.故障转移 集群初识状态是这样的&#xff1a; 其中7001、7002、7003都是master&#xff0c;我们计划让7002宕机。 4.4.1.自动故障转移 当集群中有一个master宕机会发生什么呢&#xff1f; 直接停止一个redis实例&#xff0c;例如7002&#xff1a; redis-cli -p 7002 sh…

Ubuntu22.04配置ROS2+PX4仿真环境

Ubuntu22.04配置ROS2PX4仿真环境 主要参考源&#xff1a; https://blog.csdn.net/weixin_44174421/article/details/135827130 https://blog.csdn.net/Zecet/article/details/130474620 一、准备工作 确保网络能够连接到github&#xff0c;出错主要源自于此&#xff1b;确保…