百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

Java 线程池创建方式大揭秘!互联网大厂后端开发必看

yund56 2025-05-03 16:59 33 浏览

你在互联网大厂做后端开发时,在使用 Java 线程池方面,有没有遇到过不知道该怎么创建的情况呢?项目需求一来,多线程任务一布置,线程池该如何正确创建,成了很多开发者头疼的问题。今天,咱们就深入聊聊 Java 中线程池的创建方式,帮你彻底解决这个困扰!

互联网大厂后端开发为什么离不开线程池?

在互联网大厂的后端开发场景中,高并发、大数据量处理是家常便饭。以电商平台的大促活动为例,海量用户同时下单、查询订单信息,服务器需要同时处理成千上万的请求。这时候,线程池就显得尤为重要。如果没有合理使用线程池,要么创建过多线程导致资源耗尽,服务器崩溃;要么线程数量不足,任务堆积,用户等待时间过长,严重影响用户体验。而且,Java 作为互联网后端开发的主流语言之一,其线程池机制是保障程序高效稳定运行的关键。但很多开发者对于线程池的创建,仅仅停留在一知半解的层面,这就很容易在实际开发中埋下隐患。

Java 线程池创建方式详解

Java 中线程池的创建方式主要有以下几种:

使用 Executors 工厂类创建

FixedThreadPool

通过
Executors.newFixedThreadPool(int nThreads)方法创建,它会创建一个固定大小的线程池,池中线程数量固定不变。当有新任务提交时,如果线程池中有空闲线程,就会立即执行任务;如果没有空闲线程,任务会被暂存到一个阻塞队列中,等待有线程空闲时再执行。

示例:假设我们有一个电商订单处理系统,需要同时处理 10 个订单的支付请求,每个支付请求都需要一个线程来处理。为了避免线程过多导致资源竞争,我们可以使用 FixedThreadPool 来创建一个固定大小为 10 的线程池。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FixedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for (int i = 0; i < 20; i++) {
            final int orderId = i;
            executorService.submit(() -> {
                // 模拟处理订单支付逻辑
                System.out.println("处理订单 " + orderId + " 的支付请求");
            });
        }
        executorService.shutdown();
    }
}

这种线程池适用于处理固定数量并发任务的场景,比如数据库连接池,保证固定数量的线程同时访问数据库,避免资源竞争。

CachedThreadPool

使用
Executors.newCachedThreadPool()创建,它是一个可缓存的线程池。如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程。它比较适合处理执行时间短、突发性大量请求的任务。

示例:在一个日志收集系统中,会不定期有大量的日志记录任务产生。我们可以使用 CachedThreadPool 来处理这些任务。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CachedThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 100; i++) {
            final int logId = i;
            executorService.submit(() -> {
                // 模拟记录日志逻辑
                System.out.println("记录日志 " + logId);
            });
        }
        executorService.shutdown();
    }
}

任务执行完线程就可以被回收,下次有新任务再来时又能快速创建新线程处理。

SingleThreadExecutor

通过
Executors.newSingleThreadExecutor()创建,它只有一个工作线程来执行任务。所有任务按照提交顺序依次执行,保证任务执行的顺序性。

示例:在文件按顺序读写操作的场景中,使用 SingleThreadExecutor 能确保数据的读写顺序。比如,我们要按顺序读取一系列文本文件的内容。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class SingleThreadExecutorExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        String[] fileNames = {"file1.txt", "file2.txt", "file3.txt"};
        for (String fileName : fileNames) {
            final String name = fileName;
            executorService.submit(() -> {
                // 模拟按顺序读取文件内容逻辑
                System.out.println("读取文件 " + name + " 的内容");
            });
        }
        executorService.shutdown();
    }
}

ScheduledThreadPool

使用
Executors.newScheduledThreadPool(int corePoolSize)创建,它可以实现定时任务和周期性任务的执行。

示例:在电商系统中,每天凌晨 2 点需要统计前一天的销售数据。我们可以使用 ScheduledThreadPool 来实现这个定时任务。

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 scheduledExecutorService = Executors.newScheduledThreadPool(1);
        scheduledExecutorService.scheduleAtFixedRate(() -> {
            // 模拟统计销售数据逻辑
            System.out.println("统计销售数据");
        }, 0, 1, TimeUnit.DAYS);
    }
}

通过schedule()方法可以延迟执行任务,scheduleAtFixedRate()和scheduleWithFixedDelay()方法可以实现周期性任务的执行。

通过 ThreadPoolExecutor 类手动创建

ThreadPoolExecutor 是创建线程池的核心类,通过它我们可以更灵活地配置线程池的参数。它的构造函数如下:

public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
  • corePoolSize:核心线程数,线程池创建后默认会创建的线程数量,即使这些线程处于空闲状态,也不会被销毁(除非设置了allowCoreThreadTimeOut为true)。
  • maximumPoolSize:最大线程数,线程池中允许存在的最大线程数量。当任务队列满了且工作线程数小于最大线程数时,线程池会创建新的线程来处理任务。
  • keepAliveTime:空闲线程的存活时间。当线程池中的线程数量大于核心线程数时,如果某个线程空闲时间超过keepAliveTime,就会被销毁,直到线程池中的线程数量等于核心线程数。
  • unit:keepAliveTime的时间单位,如TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)等。
  • workQueue:任务队列,用于存放等待执行的任务。常见的有ArrayBlockingQueue(有界队列)、LinkedBlockingQueue(无界队列)等。
  • threadFactory:线程工厂,用于创建线程,一般使用默认的线程工厂即可,也可以自定义线程工厂来设置线程的名称、优先级等属性。
  • handler:拒绝策略,当任务队列已满且线程数达到最大线程数时,新提交的任务会被拒绝,此时就需要通过拒绝策略来处理这些被拒绝的任务。常见的拒绝策略有AbortPolicy(抛出异常)、CallerRunsPolicy(在调用者线程中执行任务)、DiscardPolicy(丢弃任务)、DiscardOldestPolicy(丢弃队列中最老的任务,然后重新提交当前任务)。

示例:我们创建一个线程池,核心线程数为 5,最大线程数为 10,空闲线程存活时间为 60 秒,任务队列使用有界的ArrayBlockingQueue,容量为 20,拒绝策略采用CallerRunsPolicy。

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExecutorExample {
    public static void main(String[] args) {
        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(20);
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                5,
                10,
                60,
                TimeUnit.SECONDS,
                workQueue,
                new ThreadPoolExecutor.CallerRunsPolicy()
        );
        for (int i = 0; i < 50; i++) {
            final int taskId = i;
            threadPoolExecutor.submit(() -> {
                // 模拟任务执行逻辑
                System.out.println("执行任务 " + taskId);
            });
        }
        threadPoolExecutor.shutdown();
    }
}

手动创建线程池虽然相对复杂,但却能让我们根据具体的业务场景,精准地配置各项参数,以达到最佳的性能和资源利用效果。

总结

以上就是 Java 中线程池常见的创建方式。在互联网大厂后端开发中,掌握这些创建方式,合理配置线程池参数,能让你的程序在高并发场景下更加稳定、高效地运行。希望大家都能熟练运用线程池,在项目开发中少踩坑!如果你在实际使用线程池的过程中有任何问题,或者有独特的经验,欢迎在评论区留言分享,咱们一起交流探讨,共同进步!

相关推荐

SM小分队Girls on Top,女神战队少了f(x)?

这次由SM娱乐公司在冬季即将开演的smtown里,将公司的所有女团成员集结成了一个小分队project。第一位这是全面ACE的大姐成员权宝儿(BoA),出道二十年,在日本单人销量过千万,韩国国内200...

韩国女团 aespa 首场 VR 演唱会或暗示 Quest 3 将于 10 月推出

AmazeVR宣布将在十月份举办一场现场VR音乐会,观众将佩戴MetaQuest3进行体验。韩国女团aespa于2020年11月出道,此后在日本推出了三张金唱片,在韩国推出了...

韩网热议!女团aespa成员Giselle在长腿爱豆中真的是legend

身高163的Giselle,长腿傲人,身材比例绝了...

假唱而被骂爆的女团:IVE、NewJeans、aespa上榜

在韩国,其实K-pop偶像并不被认为是真正的歌手,因为偶像们必须兼备舞蹈能力、也经常透过对嘴来完成舞台。由于科技的日渐发达,也有许多网友会利用消音软体来验证K-pop偶像到底有没有开麦唱歌,导致假唱这...

新女团Aespa登时尚大片 四个少女四种style

来源:环球网

韩国女团aespa新歌MV曝光 画面梦幻造型超美

12月20日,韩国女团aespa翻唱曲《DreamsComeTrue》MV公开,视频中,她们的造型超美!WINTER背后长出一双梦幻般的翅膀。柳智敏笑容甜美。宁艺卓皮肤白皙。GISELLE五官精致...

女网友向拳头维权,自称是萨勒芬妮的原型?某韩国女团抄袭KDA

女英雄萨勒芬妮(Seraphine)是拳头在2020年推出的第五位新英雄,在还没有正式上线时就备受lsp玩家的关注,因为她实在是太可爱了。和其他新英雄不同的是,萨勒芬妮在没上线时就被拳头当成虚拟偶像来...

人气TOP女团是?INS粉丝数见分晓;TWICE成员为何在演唱会落泪?

现在的人气TOP女团是?INS粉丝数见分晓!现在爱豆和粉丝之间的交流方法变得多种多样,但是Instagram依然是主要的交流手段。很多粉丝根据粉丝数评价偶像的人气,拥有数百、数千万粉丝的组合作为全球偶...

韩国女团MVaespa Drama MV_韩国女团穿超短裙子跳舞

WelcometoDrama.Pleasefollow4ruleswhilewatchingtheDrama.·1)Lookbackimmediatelywhenyoufe...

aespa师妹团今年将出道! SM职员亲口曝「新女团风格、人数」

记者刘宛欣/综合报导南韩造星工厂SM娱乐曾打造出东方神起、SUPERJUNIOR、少女时代、SHINee、EXO等传奇团体,近年推出的aespa、RIIZE更是双双成为新生代一线团体,深受大众与粉丝...

南韩最活跃的女团aespa,新专辑《Girls》即将发布,盘点昔日经典

女团aespa歌曲盘点,新专辑《Girls》即将发布,期待大火。明天也就是2022年的7月8号,aespa新专辑《Girls》即将发行。这是继首张专辑《Savage》之后,时隔19个月的第二张专辑,这...

章泽天女团aespa出席戛纳晚宴 宋康昊携新片亮相

搜狐娱乐讯(山今/文玄反影/图科明/视频)法国时间5月23日晚,女团aespa、宋康昊、章泽天等明星亮相戛纳晚宴。章泽天身姿优越。章泽天肩颈线优越。章泽天双臂纤细。章泽天仪态端正。女团aespa亮...

Aespa舞台暴露身高比例,宁艺卓脸大,柳智敏有“TOP”相

作为SM公司最新女团aespa,初舞台《BlackMamba》公开,在初舞台里,看得出来SM公司是下了大功夫的,虽然之前SM公司新出的女团都有很长的先导片,但是aespa显然是有“特殊待遇”。运用了...

AESPA女团成员柳智敏karina大美女

真队内速度最快最火达成队内首个且唯一两百万点赞五代男女团中输断层第一(图转自微博)...

对来学校演出的女团成员语言性骚扰?韩国这所男高的学生恶心透了

哕了……本月4日,景福男子高中相关人士称已经找到了在SNS中上传对aespa成员进行性骚扰文章的学生,并开始着手调查。2日,SM娱乐创始人李秀满的母校——景福高中迎来了建校101周年庆典活动。当天,S...