Advertisement

大话Java系列-线程池的应用,固定大小线程池,缓存线程池,单一线程线程池,定时线程池

阅读量:

文章目录

      • 故事开始:固定大小线程池(FixedThreadPool)
      • 故事发展:缓存线程池(CachedThreadPool)
      • 故事高潮:单一线程线程池(SingleThreadExecutor)
      • 故事结尾:定时线程池(ScheduledThreadPool)

在一个遥远的国度里,有一个名叫阿里的年轻人。阿里不仅聪明好学,而且乐于助人,他生活在一个由各种计算机组成的王国中。在这个王国里,每台计算机都是一栋房子,而每个房子都有一个特别的房间,这个房间就是“线程池”。

Gitee链接地址,建议收藏,后续我会对专栏进行整理,每篇文章进行校正和调整,然后统一存放在gitee仓库中

故事开始:固定大小线程池(FixedThreadPool)

有一天,国王委托阿里完成一项任务——整理王国中所有的图书。图书数量庞大,如果只靠阿里一个人,可能需要花费很长的时间。于是,阿里想到了他的好朋友——固定大小线程池。

固定大小线程池就像一支人数固定的志愿者队伍。这支队伍的人数从一开始就被确定下来了,无论是5个人还是10个人,他们都会一直工作直到任务完成。当有新的任务来临时,如果队伍中还有空闲的成员,他们就会立即接手任务;如果没有空闲的成员,则新来的任务必须等待,直到有成员完成了手头的工作。

复制代码
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class FixedThreadPoolExample {
    public static void main(String[] args) {
        // 创建一个固定大小为5的线程池
        ExecutorService executor = Executors.newFixedThreadPool(5);
    
        // 模拟图书整理任务
        for (int i = 0; i < 10; i++) {
            int bookId = i;
            Runnable worker = () -> {
                System.out.println("正在整理图书 " + bookId + " - " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000); // 模拟整理图书所需的时间
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            executor.execute(worker);
        }
    
        // 关闭线程池
        executor.shutdown();
        while (!executor.isTerminated()) {
        }
        System.out.println("所有图书整理任务已完成!");
    }
    }
    
    
    java
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-11/qW5URxfb2kTjYzeLZPspaH8FIl37.png)

阿里利用固定大小线程池,合理分配了任务,最终在规定时间内高效地完成了图书整理工作。这说明固定大小线程池适合处理已知规模的任务集合,能够有效地控制资源消耗,避免过多的线程创建导致系统负担过重

故事发展:缓存线程池(CachedThreadPool)

图书整理完成后,阿里又接到了新的任务——收集王国各地的民间故事。这项任务没有明确的数量限制,而且任务到达的时间也不确定。面对这样的挑战,阿里决定求助于他的另一位朋友——缓存线程池。

缓存线程池就像是一个随时待命的大型团队,这个团队的特点是成员数量可以无限增加。每当有新的任务到来时,如果有空闲的成员,就直接接手任务;如果没有空闲的成员,就会新增加成员来完成任务。但是,这些新增加的成员并不是永远存在的,如果一段时间内没有新的任务,这些成员就会自动消失,以节省资源。

复制代码
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class CachedThreadPoolExample {
    public static void main(String[] args) {
        // 创建一个缓存线程池
        ExecutorService executor = Executors.newCachedThreadPool();
    
        // 模拟故事收集任务
        for (int i = 0; i < 20; i++) {
            int storyId = i;
            Runnable worker = () -> {
                System.out.println("正在收集故事 " + storyId + " - " + Thread.currentThread().getName());
                try {
                    Thread.sleep(500); // 模拟收集故事所需的时间
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            executor.execute(worker);
        }
    
        // 关闭线程池
        executor.shutdown();
        while (!executor.isTerminated()) {
        }
        System.out.println("所有故事收集任务已完成!");
    }
    }
    
    
    java
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-11/T80uEhAN1yoC25qjVJQrWMLxdpki.png)

通过使用缓存线程池,阿里能够快速响应未知数量的任务请求,即使任务突然增多也能迅速应对,确保了故事收集工作的顺利进行。这表明缓存线程池适用于执行大量耗时较短的任务,它能够根据实际情况动态调整线程数量,提高系统的响应速度和资源利用率

故事高潮:单一线程线程池(SingleThreadExecutor)

随着故事收集工作的深入,阿里发现有些故事需要特别小心地记录,以免丢失重要的细节。这时,他想到了使用单一线程线程池。

单一线程线程池就像是阿里最信任的助手,无论有多少任务,这个助手一次只会做一件事,并且严格按照任务提交的顺序来执行。这种方式虽然效率不高,但对于需要保证任务执行顺序或者对资源访问有严格要求的情况非常有用。

复制代码
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class SingleThreadExecutorExample {
    public static void main(String[] args) {
        // 创建一个单一线程线程池
        ExecutorService executor = Executors.newSingleThreadExecutor();
    
        // 模拟精细记录故事任务
        for (int i = 0; i < 5; i++) {
            int storyId = i;
            Runnable worker = () -> {
                System.out.println("正在精细记录故事 " + storyId + " - " + Thread.currentThread().getName());
                try {
                    Thread.sleep(1000); // 模拟记录故事所需的时间
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            executor.execute(worker);
        }
    
        // 关闭线程池
        executor.shutdown();
        while (!executor.isTerminated()) {
        }
        System.out.println("所有故事记录任务已完成!");
    }
    }
    
    
    java
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-11/X7ypb0nSPYE93r46iLUmFtxGlAkJ.png)

阿里利用单一线程线程池处理那些需要精细记录的故事,确保了每个故事都能得到妥善保存。这体现了单一线程线程池适用于需要保证任务顺序执行或资源独占访问的场景

故事结尾:定时线程池(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) {
        // 创建一个定时线程池,初始线程数为3
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
    
        // 模拟庆典准备工作
        Runnable prepareVenue = () -> System.out.println("正在布置场地 - " + Thread.currentThread().getName());
        Runnable prepareFood = () -> System.out.println("正在准备食物 - " + Thread.currentThread().getName());
    
        // 延迟2秒后执行布置场地任务
        executor.schedule(prepareVenue, 2, TimeUnit.SECONDS);
    
        // 延迟5秒后,每隔3秒重复执行准备食物任务
        executor.scheduleAtFixedRate(prepareFood, 5, 3, TimeUnit.SECONDS);
    
        // 让主线程等待一段时间,以便观察任务执行情况
        try {
            Thread.sleep(20000); // 等待20秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    
        // 关闭线程池
        executor.shutdown();
        System.out.println("所有庆典准备工作已完成!");
    }
    }
    
    
    java
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-11/NvVa2cin0RqtDJlpjFkSHgWEmKUM.png)

通过这次经历,阿里深刻体会到了不同类型的线程池各自的优势与适用场景,也更加明白了合理选择工具的重要性。定时线程池特别适合于需要在未来某一时刻执行任务或者定期执行任务的场合

Gitee链接地址,建议收藏,后续我会对专栏进行整理,每篇文章进行校正和调整,然后统一存放在gitee仓库中

阿里和他的朋友们通过智慧和努力,不仅圆满完成了任务,还为整个计算机王国带来了欢乐和知识。这个故事告诉我们,在现实世界中解决问题时,选择合适的工具和技术是多么重要。

全部评论 (0)

还没有任何评论哟~