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.hqwc.cn/news/625324.html

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

相关文章

靶向中医是新时代的中医

自古以来&#xff0c;中医以其独特的理论和实践体系为人类健康事业作出了巨大的贡献。然而&#xff0c;在现代医学快速发展的背景下&#xff0c;中医的传承与发展面临新的挑战和机遇。靶向中医&#xff0c;作为一种新型的中医诊疗模式&#xff0c;是我们中医增效计划的理论基础…

大模型驱动的汽车行业群体智能技术白皮书2024(175页)

来源&#xff1a;易慧智能&amp清华大学 随着科技的飞速发展&#xff0c;汽车行业正面临着颠覆性的变革。从传统 的燃油车到电动汽车&#xff0c;从手动驾驶到自动驾驶&#xff0c;从机械座舱、电子座 舱到智能座舱&#xff0c;每一次的技术突破都在推动着汽车行业的进步。…

KDTree索引(K近邻搜索,半径R内近邻搜索)——PCL

K近邻搜索&#xff08;K Nearest Neighbors&#xff09; K近邻搜索是一种基于点数量的搜索方法&#xff0c;它会找到指定点附近最接近的K个邻居点。K近邻搜索中的K值是一个参数&#xff0c;您需要指定要搜索的邻居数量。该方法适用于需要查找固定数量邻居点的情况&#xff0c;…

Python基于深度学习的车辆特征分析系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

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

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

【InternLM 实战营第二期笔记】LMDeploy 量化部署 LLMVLM实战

Huggingface与TurboMind介绍 Huggingface HuggingFace是一个高速发展的社区&#xff0c;包括Meta、Google、Microsoft、Amazon在内的超过5000家组织机构在为HuggingFace开源社区贡献代码、数据集和模型。可以认为是一个针对深度学习模型和数据集的在线托管社区&#xff0c;如…

内网kift私有网盘如何实现在外网公网访问?快解析映射方案

KIFT是一款面向个人、团队、小型组织的网盘服务器系统&#xff0c;安装运行比较简单&#xff0c;开箱即用&#xff0c;下载解压&#xff0c;双击jar文件即可启动。因为是开源的&#xff0c;不少人选择使用KIFT做开源私有网盘&#xff0c;有能力的大佬还可以对它进行定制开发。 …

25 vs code配置

1.中文语言 搜索chinese&#xff0c;安装&#xff0c;等待重新打开 2.remote ssh 安装后F1打开&#xff0c;输入adduser 输入ssh [用户名][主机ip]&#xff0c;添加主机&#xff0c;然后选择保存配置文件 如果出现管道不存在&#xff0c;设置一下 如果出问题&#xff0c;也…

自定义类似微信效果Preference

1. 为自定义Preference 添加背景&#xff1a;custom_preference_background.xml <?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"><item><shape android:s…

【Web】陇原战“疫“2021网络安全大赛 题解

目录 CheckIN eaaasyphp EasyJaba CheckIN 拿到附件&#xff0c;贴出关键代码 func getController(c *gin.Context) {cmd : exec.Command("/bin/wget", c.QueryArray("argv")[1:]...)err : cmd.Run()if err ! nil {fmt.Println("error: ", …

SpringBoot相关知识点总结

1 SpringBoot的目的 简化开发&#xff0c;开箱即用。 2 Spring Boot Starter Spring Boot Starter 是 Spring Boot 中的一个重要概念&#xff0c;它是一种提供依赖项的方式&#xff0c;可以帮助开发人员快速集成各种第三方库和框架。Spring Boot Starter 的目的是简化 Sprin…

音频---数字mic

一、常见的数字mic pdm麦通过codec芯片将数字麦转换为i2s信号输入到SOC 纯pdm麦就是直接进入SOC的pdm接口&#xff0c;走的是PDM信号&#xff0c;PDM信号就是两个线&#xff0c;一根数据线一根时钟线&#xff08;如顺芯ES7201/7202把MIC信号转换成PDM&#xff09;。 二、DMIC…