并发编程系列(2)- 线程池代码实战

本文介绍了线程池在并发编程中的使用场景,强调了任务之间的独立性和线程池隔离的重要性。通过一个字数统计工具的代码实战,展示了如何创建线程池、设置线程数量,并分析了不同线程池配置对执行时间的影响,以帮助开发者理解如何合理使用线程池。
摘要由CSDN通过智能技术生成

上一节并发编程系列(1)- 线程池原理 已经初步介绍线程池的原理、线程池的创建,但是实际在项目中应该如何使用线程池呢?

一、使用场景介绍

当遇到重复性、且互相无依赖的任务的时候,可以用多线程来实现。
比如:上传多个文件、解析多个文件等等,这些行为相互之间不会影响(即一个任务不依赖与另一个任务的执行成功与否,也不依赖于其执行的结果)。
如果任务执行相互依赖,那么可以用异步去实现。

二、代码实战

下面用一个简单的例子来熟悉下线程池的使用。

1、线程池工厂类-用于创建合适的线程池:

首先创建一个FILE_EXECUTOR,用于创建多线程读取文件的线程池。
(注意:在实际项目开发中,要注意线程池隔离,即不同作用的线程池需要单独定义,我这里有个读取文件任务的线程池,定义为FILE_EXECUTOR;若有上传文件的,可以再定义一个UPLOAD_EXECUTOR)。

不同线程池因任务类型的不同,参数设置也不同;若不注意线程隔离,多个任务共用同一个线程池,很可能会因为某个任务执行失败、线程池停止,导致别的任务也停止执行。

线程池工厂类如下:

/**
 * Created by wanggenshen
 * Date: on 2018/11/3 16:25.
 * Description: 线程池工厂类
 */
public final class ThreadPoolFactory {
   

    private static int CORE_POOL_SIZE = 5;
    private static int MAX_POOL_SIZE = 10;
    private static int KEEPALIVE_SECONDS = 120;
    private static int QUEUE_SIZE = 120;
    
    // 创建一个名为FILE_EXECUTOR的线程池,用于多线程读取文件字数
    public static final ExecutorService FILE_EXECUTOR;

    public ThreadPoolFactory() {
   
    }

    static {
   
       // 线程池创建
        FILE_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE,
                MAX_POOL_SIZE,
                (long)KEEPALIVE_SECONDS,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue(QUEUE_SIZE),
                new ThreadFactoryBuilder().setNameFormat("thread-pool-%d").build(),
                new ThreadPoolFactory.MyRejectedExecutionHandler());
    }

    /**
     * 自定义Reject策略
     */
    static class MyRejectedExecutionHandler implements RejectedExecutionHandler {
   

        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
   
            if (!executor.isShutdown()) {
   
                try {
   
                    executor.getQueue().put(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值