java创建线程池的方法

简介

线程池是一种用于管理和重用线程的机制,它可以有效地管理线程的创建和销毁,减少线程创建和销毁的开销,并且能够控制并发线程数量,避免资源耗尽和系统过载。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() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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.mzph.cn/news/822188.shtml

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

相关文章

【学习】jemter中如何高效使用正则表达式

在Jemter的世界里&#xff0c;正则表达式无疑是一把锐利的剑&#xff0c;它可以帮助我们轻松地解决许多问题。在Jemter的性能测试过程中&#xff0c;我们常常需要提取响应中的某些数据&#xff0c;以便在后续的请求中使用。这时&#xff0c;正则表达式就派上用场了。通过学习如…

【web开发网页制作】html+css家乡长沙旅游网页制作(4页面附源码)

家乡长沙网页制作 涉及知识写在前面一、网页主题二、网页效果Page1、主页Page2、历史长沙Page3、著名人物Page4、留言区 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码HtmlCSS 五、源码获取5.1 获取方式 作者寄语 涉及知识 家乡长沙网页制作&#x…

Linux下的IP地址与主机名

IP和主机名 IP地址和主机名 什么是IP地址 IP地址 每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯 IP地址主要有2个版本&#xff0c;V4版本和V6版本&#xff08;V6很少用&#xff0c;课程暂不涉及&#xff09; IPv4版本的地址格式是&#xff1a;a.b…

【AIGC】AIGC在虚拟数字人中的应用:塑造未来互动体验的革新力量

&#x1f680; &#x1f680; &#x1f680;随着科技的快速发展&#xff0c;AIGC已经成为引领未来的重要力量。其中&#xff0c;AIGC在虚拟数字人领域的应用更是引起了广泛关注。虚拟数字人作为一种先进的数字化表达形式&#xff0c;结合了3D建模、动画技术、人工智能等多种先进…

如何提取音频中的封面

大家在播放MP3音乐的时候经常可以在播放器上看到这个音乐的封面&#xff0c;那么我们要如何提取MP3的音乐里面的封面呢&#xff1f; 打开智游剪辑&#xff08;官网: zyjj.cc&#xff09;&#xff0c;搜索音乐封面提取 然后就只需要拖入MP3文件点击提交就可以了 下面这里简单展示…

Python100个库分享第20个—xlrd(办公库篇)

目录 专栏导读库的介绍库的功能库的安装测试数据准备基础用法1:读取xlsx表格基础用法2:读取指定单元格的数据基础用法3:工作表的一些基本信息总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌…

预分频器×重装载值)/LSI频率 为什么等于总时间

1. 第一种算法理解&#xff1a;分频系数 64 &#xff0c;外部低速时钟40khz&#xff0c; 则一次计数周期1.6ms &#xff0c;计数625个数&#xff0c;则有625个周期 &#xff0c;1.6ms*625 等于1s 如果分频系数是64&#xff0c;外部低速时钟&#xff08;LSI&#xff09;频率是…

Linux硬件管理

文章目录 Linux硬件管理1.查看磁盘空间 df -h2.查看文件的磁盘占用空间 du -ah3.查看系统内存占用情况 htop Linux硬件管理 1.查看磁盘空间 df -h 语法 df [选项][参数]选项 -a或–all&#xff1a;包含全部的文件系统&#xff1b; –block-size<区块大小>&#xff1a;…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十三 简单去除图片水印效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十三 简单去除图片水印效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十三 简单去除图片水印效果 一、简单介绍 二、简单去除图片水印效果实现原理 三、简单去除图片水印效果案例…

神经网络压缩图像

简介 典型的压缩管道由四个组件组成&#xff1a; 编码&#xff1a;输入图像 x x x通过编码器函数 ε \varepsilon ε&#xff0c;将其转换为潜在表示 z z z。 量化&#xff1a;截断 z z z以丢弃一些不重要的信息 熵编码&#xff1a;使用某种形式的熵编码&#xff08;例如&…

盲人安全导航技巧:科技赋能让出行更自如

作为一名资深记者&#xff0c;长期关注并报道无障碍领域的发展动态。今日&#xff0c;我将聚焦盲人安全导航技巧&#xff0c;探讨这一主题下科技如何赋能视障人士实现更为安全、独立的出行。一款融合了实时避障、拍照识别物体及场景功能的盲人出行辅助应用叫做蝙蝠避障&#xf…

Java中Session的实现

在Java中&#xff0c;Session是一种用于在Web应用程序中跟踪用户状态的机制。它允许服务器在不同的HTTP请求之间存储和检索特定于用户的信息。Session是建立在HTTP协议之上的&#xff0c;它通过在服务器和客户端之间传递一个唯一的标识符来跟踪用户。 下面是对Java中的Session的…

4G/5G布控球/移动执法仪/智能单兵电力巡检远程视频智能监控方案

一、背景与需求 随着科技的不断进步&#xff0c;视频监控技术已成为电力行业不可或缺的一环。电力行业的巡检及建设工作&#xff0c;因施工现场在人迹罕见的野外或山区&#xff0c;地形复杂多变&#xff0c;安全更是重中之重&#xff0c;现场工作的视频图像需实时传回监管中心…

【读论文】【泛读】三篇生成式自动驾驶场景生成: Bevstreet, DisCoScene, BerfScene

文章目录 1. Street-View Image Generation from a Bird’s-Eye View Layout1.1 Problem introduction1.2 Why1.3 How1.4 My takeaway 2. DisCoScene: Spatially Disentangled Generative Radiance Fields for Controllable 3D-aware Scene Synthesis2.1 What2.2 Why2.3 How2.4…

LabVIEW变速箱自动测试系统

LabVIEW变速箱自动测试系统 在农业生产中&#xff0c;采棉机作为重要的农用机械&#xff0c;其高效稳定的运行对提高采棉效率具有重要意义。然而&#xff0c;传统的采棉机变速箱测试方法存在测试效率低、成本高、对设备可能产生损害等问题。为了解决这些问题&#xff0c;开发了…

HTTP协议安全传输教程

HTTP协议有多个版本&#xff0c;包括但不限于HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2和HTTP/3。这些版本各自具有不同的特点和改进&#xff0c;以适应网络技术的发展和满足不同的需求。例如&#xff0c;HTTP/1.0使用文本格式传输数据&#xff0c;简单易用且兼容性好&#xff0c;…

十大排序——11.十大排序的比较汇总及Java中自带的排序算法

这篇文章对排序算法进行一个汇总比较&#xff01; 目录 0.十大排序汇总 0.1概述 0.2比较和非比较的区别 0.3基本术语 0.4排序算法的复杂度及稳定性 1.冒泡排序 算法简介 动图演示 代码演示 应用场景 算法分析 2.快速排序 算法简介 动图演示 代码演示 应用场景…

Linux LVM与磁盘配额

目录 一.LVM概述 LVM LVM机制的基本概念 PV&#xff08;Physical Volume&#xff0c;物理卷&#xff09; VG&#xff08;Volume Group&#xff0c;卷组&#xff09; LV&#xff08;Logical Volume&#xff0c;逻辑卷&#xff09; 二.LVM 的管理命令 三.创建并使用LVM …

04-12 周五基于VS code + Python实现CSDN发布文章的自动生成

简介 之前曾经说过&#xff0c;在撰写文章之后&#xff0c;需要&#xff0c;同样需要将外链的图像转换为的形式&#xff0c;因此&#xff0c;可以参考 04-12 周五 基于VS Code Python 实现单词的自动提取 配置步骤 配置task 在vscode的命令面板configure task。配置如下的任…

UbuntuServer22.04安装docker

通过ubuntuserver安装docker是搭建开发环境最便捷的方式之一。下面介绍一下再ubuntu22.04上如何安装docker。相关内容参考官网链接&#xff1a;Install Docker Engine on Ubuntu 根据官网推荐&#xff0c;利用apt命令的方式安装&#xff0c;首先需要设置docker仓库&#xff0c…