Java中线程池的创建方式有几种?

在Java中,线程池是一种用于管理多个线程的机制,旨在提高性能并简化多线程编程。Java提供了多种方式来创建和管理线程池,主要通过java.util.concurrent包中的ExecutorService接口和Executors类来实现。以下是几种常见的线程池创建方式:

1. 使用Executors类创建线程池

Executors类提供了一些静态工厂方法来创建常见的线程池类型:

a. Fixed Thread Pool

创建一个固定大小的线程池,当所有线程都在忙时,新任务会在队列中等待。

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);

b. Cached Thread Pool

创建一个可缓存的线程池,适合执行很多短期异步任务。线程池根据需要创建新线程,空闲线程会在60秒后被终止和移除。

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

c. Single Thread Executor

创建一个只有一个线程的线程池,确保所有任务按顺序执行。

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

d. Scheduled Thread Pool

创建一个线程池,它可以在给定的延迟后或定期执行任务。

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);

2. 使用ThreadPoolExecutor类创建线程池

ThreadPoolExecutor是Java中最灵活的线程池实现,可以自定义线程池的行为。它提供了更多配置选项:

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;ThreadPoolExecutor customThreadPool = new ThreadPoolExecutor(4,                       // core pool size10,                      // maximum pool size60,                      // time to keep idle threads aliveTimeUnit.SECONDS,        // time unit for keep alive timenew LinkedBlockingQueue<Runnable>()  // work queue
);

3. 使用ForkJoinPool创建线程池

ForkJoinPool是Java 7引入的一个特殊的线程池,适合处理大量小任务的并行执行,尤其适合递归任务。

ForkJoinPool forkJoinPool = new ForkJoinPool();

线程池的关闭

无论使用哪种方式创建线程池,在完成任务后,应该关闭线程池以释放资源:

executorService.shutdown();  // 优雅地关闭,不接受新任务
executorService.shutdownNow();  // 强制关闭,试图终止当前正在执行的任务

线程池创建方式总结

  • Executors:提供了方便的静态工厂方法来创建常见类型的线程池。

    • newFixedThreadPool(int n): 固定大小线程池。
    • newCachedThreadPool(): 可缓存的线程池。
    • newSingleThreadExecutor(): 单线程池。
    • newScheduledThreadPool(int corePoolSize): 定时线程池。
  • ThreadPoolExecutor:提供了高度可配置的线程池实现,可以精细控制线程池的行为。

  • ForkJoinPool:用于并行处理大量小任务,特别是递归任务。

根据应用程序的需求选择合适的线程池实现,可以显著提高性能并简化多线程编程。

案例

这里提供每种线程池的详细案例,帮助你理解它们的使用场景和方式。

1. Fixed Thread Pool

创建一个固定大小的线程池,适合有固定数量线程执行长期任务的场景。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class FixedThreadPoolExample {public static void main(String[] args) {ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);for (int i = 0; i < 10; i++) {final int taskNumber = i;fixedThreadPool.execute(() -> {System.out.println("Task " + taskNumber + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}fixedThreadPool.shutdown();}
}

2. Cached Thread Pool

创建一个可缓存的线程池,适合执行大量短期任务。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class CachedThreadPoolExample {public static void main(String[] args) {ExecutorService cachedThreadPool = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {final int taskNumber = i;cachedThreadPool.execute(() -> {System.out.println("Task " + taskNumber + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}cachedThreadPool.shutdown();}
}

3. Single Thread Executor

创建一个单线程池,适合需要保证任务顺序执行的场景。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class SingleThreadExecutorExample {public static void main(String[] args) {ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();for (int i = 0; i < 10; i++) {final int taskNumber = i;singleThreadExecutor.execute(() -> {System.out.println("Task " + taskNumber + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}singleThreadExecutor.shutdown();}
}

4. Scheduled Thread Pool

创建一个定时线程池,适合需要定时或周期性执行任务的场景。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduledThreadPoolExample {public static void main(String[] args) {ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);Runnable task = () -> {System.out.println("Scheduled task is running by " + Thread.currentThread().getName());};// 定时任务,延迟2秒后执行scheduledThreadPool.schedule(task, 2, TimeUnit.SECONDS);// 周期性任务,延迟1秒后每3秒执行一次scheduledThreadPool.scheduleAtFixedRate(task, 1, 3, TimeUnit.SECONDS);// 允许一些时间让任务执行try {Thread.sleep(10000);} catch (InterruptedException e) {Thread.currentThread().interrupt();}scheduledThreadPool.shutdown();}
}

5. ThreadPoolExecutor

创建一个自定义的线程池,适合需要精细控制线程池行为的场景。

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class CustomThreadPoolExample {public static void main(String[] args) {ThreadPoolExecutor customThreadPool = new ThreadPoolExecutor(4,                       // core pool size10,                      // maximum pool size60,                      // time to keep idle threads aliveTimeUnit.SECONDS,        // time unit for keep alive timenew LinkedBlockingQueue<Runnable>()  // work queue);for (int i = 0; i < 10; i++) {final int taskNumber = i;customThreadPool.execute(() -> {System.out.println("Task " + taskNumber + " is running by " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行} catch (InterruptedException e) {Thread.currentThread().interrupt();}});}customThreadPool.shutdown();}
}

6. ForkJoinPool

创建一个适合并行处理大量小任务的线程池,特别是递归任务。

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;public class ForkJoinPoolExample {public static void main(String[] args) {ForkJoinPool forkJoinPool = new ForkJoinPool();try {FibonacciTask task = new FibonacciTask(10);Integer result = forkJoinPool.invoke(task);System.out.println("Fibonacci result: " + result);} finally {forkJoinPool.shutdown();}}static class FibonacciTask extends RecursiveTask<Integer> {private final int n;FibonacciTask(int n) {this.n = n;}@Overrideprotected Integer compute() {if (n <= 1) {return n;}FibonacciTask f1 = new FibonacciTask(n - 1);FibonacciTask f2 = new FibonacciTask(n - 2);f1.fork(); // 异步执行return f2.compute() + f1.join(); // 合并结果}}
}

这些示例展示了不同类型线程池的使用方式,根据不同的需求选择合适的线程池类型,可以帮助优化多线程程序的性能和管理复杂度。

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

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

相关文章

宝塔面板部署前端项目

部署前端项目 1 打包自己的项目2 登录宝塔面板3 添加站点4 设置域名5 进入当前站点对应的文件目录中6 上传打包后的文件7 访问网站 1 打包自己的项目 2 登录宝塔面板 点击左侧“网站”菜单进入对应页面 点击“添加站点” 3 添加站点 填写域名&#xff0c;如果没有域名的&am…

集成openfeign

集成feign有两种方式. 1.集成到所需项目中(只有该项目可以用)直接引用所需调用的项目 2.集成到公共项目(通用) 1.集成到所需项目中(只有该项目可以用) 再需要消费的服务 进行依赖的引用 1.引入依赖,openfeign,和所需调用的服务 <!--feign--><dependency><gro…

超详细!ArcGIS常用功能快捷键汇总,提高你的工作效率

以下列出了一些在 ArcMap 中可用的键盘快捷键&#xff0c;其中许多也可以应用在 ArcGlobe 和 ArcScene 中。另外&#xff0c;在 ArcMap 中编辑和处理表时&#xff0c;还存在一些可用的键盘快捷键。 您也可以为某个命令指定自己的快捷键。 在 ArcMap 中执行操作时&#xff0c;…

代码随想录算法训练营day65 | 99. 岛屿数量 深搜、99. 岛屿数量 广搜、100. 岛屿的最大面积

本次题目都是卡码网上的 99. 岛屿数量 深搜 dirs [(1, 0), (0, 1), (-1, 0), (0, -1)]def dfs(grid, visited, x, y):for i in range(4):nextx x dirs[i][0]nexty y dirs[i][1]# 越界了&#xff0c;直接跳过if nextx < 0 or nextx > len(grid) or nexty < 0 or…

FCM(Framework Compatibility Matrix)

FCM&#xff08;Framework Compatibility Matrix&#xff09;是Android Open Source Project&#xff08;AOSP&#xff09;中的一个关键组件&#xff0c;用于定义和描述Android框架与设备之间的兼容性关系。以下是关于FCM的详细回答&#xff1a; 定义和目的&#xff1a; FCM是…

【研究】AI大模型需要什么样的硬件?

关注AI大模型 x 硬件的两条思路 从22年11月OpenAI推出ChatGPT至今&#xff0c;我们看到Chatbot应用的能力不断增强&#xff0c;从最初的文字问答&#xff0c;迅速向具有自主记忆、推理、规划和执行的全自动能力的AI Agent发展。我们认为端侧智能是大模型发展的重要分支。建议投…

Open WebUI升级到最新版本

背景介绍 open-webui是一个用于构建Web用户界面的开源库&#xff0c;它仿照 ChatGPT 的图形化界面&#xff0c;可以非常方便的调试、调用本地大语言模型。 目前该开源库更新较为活跃&#xff0c;从3个月前的版本&#xff08;v0.1.108&#xff09;到截止到2024年6月中旬发布的…

牛皮!手写一个 RPC 框架

设计一个RPC&#xff08;远程过程调用&#xff09;框架是一个复杂的过程&#xff0c;涉及到网络通信、序列化与反序列化、服务发现、负载均衡、容错机制等多个方面。以下是设计RPC框架的一些基本步骤&#xff1a; 1. 需求分析&#xff1a; 确定RPC框架需要支持的特性&#xf…

软件测试:实验二 白盒测试技术

一、实验目的 掌握静态白盒测试的技术和原理。掌握逻辑覆盖测试的方法和原理。掌握基本路径测试的方法和原理。 二、实验要求 掌握静态白盒测试的技术和原理。按照实验题目要求&#xff0c;完成指定程序的白盒测试。 三、实验内容与步骤 1、逻辑覆盖测试。请编写测试用例指…

2024年春季学期《算法分析与设计》考前热身练习(历年真题)[纯C语言+思路]

A: 递归求解 题目描述 请使用递归编写一个程序求如下表达式的计算结果&#xff1a; S(1) 1/2 S(2) 1/2 1/6 S(3) 1/2 1/6 1/12 S(4) 1/2 1/6 1/12 1/20 ...... S(n) 1/2 1/6 1/12 1/20 1/30 ...... 输入n (1<n<1000)&#xff0c;输出表达式S(n)的值&…

Oracle CPU使用率过高问题处理

1.下载Process Explorer 2.打开Process Explorer&#xff0c;查看CPU使用情况最高的进程 3.双击该进程&#xff0c;查看详情 \ 4. 获取cpu使用最好的线程tid 5. 查询sql_id select sql_id from v$session where paddr in( select addr from v$process where spid in(1…

电脑开机后出现Aptio Setup Utility 处理方法

电脑开机后出现Aptio Setup Utility怎么处理 Aptio Setup Utility界面的原因&#xff1a; 这是由于 bios设置与真实的硬件情况不匹配硬盘故障找不到可启动的硬盘情况 我的问题是找不到可启动的硬盘情况 解决方式如下&#xff1a; 进入如下界面了&#xff0c;选择Boot选项…

通过语言模型奖励实现视频大型多模态模型的直接偏好优化

在人工智能领域&#xff0c;大模型&#xff08;LLM&#xff09;的泛化能力一直是研究的重点。最新的研究通过直接偏好优化&#xff08;DPO&#xff09;技术&#xff0c;显著提升了LLM在视频指令跟随等任务中的表现。然而&#xff0c;提供信息丰富的反馈以检测生成响应中的幻觉现…

自然语言处理课程论文:《Attention is all you need》复现与解读

目录 1.背景介绍 1.1 文献介绍 1.2 研究背景 1.3 知识概述 1.3.1 机器翻译 1.3.2 attention机制与self-attention机制 2.数据来源与处理 2.1 数据集描述 2.2 数据处理 3. 模型架构 ​​​​​​​3.1 Positional Embedding ​​​​​​​3.2 Multi-Head Attention ​​​​​…

Qt-Advanced-Docking-System示例程序

写了一些简单的示例程序&#xff0c;帮助我更好地使用和了解Qt-Advanced-Docking-System 1.写一个如图页面布局的程序 m_pDockMangernew ads::CDockManager(this);this->setCentralWidget(m_pDockManger);ads::CDockWidget* centerDockWidgetnew ads::CDockWidget("中…

通过 PHP 实现自动爬虫爬取,以及分析抓取的数据

近年来&#xff0c;随着互联网的发展&#xff0c;数据爬取成为许多企业和个人所关注和需要的问题。数据爬取是通过编程技术从互联网上自动抓取数据进行分析&#xff0c;以达到自身的目的。其中&#xff0c;php 是一种非常常用且具有优势的编程语言&#xff0c;下面我们将讨论如…

JetBrains WebStorm 2024 mac/win版:效率至上,编码无忧

JetBrains WebStorm 2024 是一款专为前端开发者和全栈工程师打造的高 级集成开发环境(IDE)。它提供了对JavaScript、TypeScript、HTML5、CSS等技术的全面支持&#xff0c;帮助开发者更高效地进行前端开发。 WebStorm 2023 mac/win版获取 WebStorm 2024 拥有强大的智能代码补全…

从一万英尺外看libevent(源码刨析)

从一万英尺外看libevent 温馨提示&#xff1a;阅读时间大概二十分钟 前言 Libevent是用于编写高速可移植非阻塞IO应用的库&#xff0c;其设计目标是&#xff1a; 可移植性&#xff1a;使用libevent编写的程序应该可以在libevent支持的所有平台上工作。即使没有好的方式进行非…

js实现拖拽排序

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>拖拽排序</title><style>* {margin: 0;p…

manim边学边做--SingleStringMathTex

SingleStringMathTex是Mobjects分类中用来显示数学公式的class。 manim中有3个可以用来显示数学公式的class&#xff0c;还有两个是MathTex和Tex&#xff0c;后续再介绍。 从SingleStringMathTex的名称中也可以看出&#xff0c;它是用来显示只有一行的简单公式。 SingleStrin…