线程池的常用参数

线程池是Java等编程语言中常用的一种多线程处理形式,它可以管理和控制线程的数量,减少了系统开销,提高了处理效率。以下是一些线程池的常用参数:

corePoolSize

corePoolSize是线程池中保持活动的最小线程数。这个参数决定了线程池在启动后初始创建的线程数量。当提交一个任务时,如果线程池中的线程数量小于corePoolSize,就会立即创建新的线程执行任务。如果线程池中的线程数量已经达到corePoolSize,则任务会被放入任务队列中等待。

ExecutorService executor = new ThreadPoolExecutor(  
    5, // corePoolSize  
    10, // maximumPoolSize  
    60, // keepAliveTime  
    TimeUnit.SECONDS,  
    new LinkedBlockingQueue<Runnable>() // 任务队列  
);

maximumPoolSize

maximumPoolSize表示线程池中允许同时执行的最大线程数。如果任务的数量超过了线程池中的核心线程数,并且队列已满,线程池会创建更多的线程来处理任务,但是最多不超过maximumPoolSize。如果已经达到了maximumPoolSize,并且队列已满,那么任务会直接被拒绝。

ExecutorService executor = new ThreadPoolExecutor(  
    5, // corePoolSize  
    10, // maximumPoolSize  
    60, // keepAliveTime  
    TimeUnit.SECONDS,  
    new LinkedBlockingQueue<Runnable>() // 任务队列  
);

keepAliveTime

keepAliveTime表示超过corePoolSize数量的空闲线程在多少时间内会被销毁。也就是说,当线程池中的线程数量超过了corePoolSize,但是在这段时间内没有新的任务提交,那么超出corePoolSize部分的线程会被销毁,直到线程池中的线程数量等于corePoolSize为止。

ExecutorService executor = new ThreadPoolExecutor(  
    5, // corePoolSize  
    10, // maximumPoolSize  
    60, // keepAliveTime  
    TimeUnit.SECONDS,  
    new LinkedBlockingQueue<Runnable>() // 任务队列  
);

unit

unit表示keepAliveTime的时间单位。在上面的代码例子中,keepAliveTime的单位是秒。可以根据需要设置为其他的时间单位,比如毫秒、分钟等。

ExecutorService executor = new ThreadPoolExecutor(  
    5, // corePoolSize  
    10, // maximumPoolSize  
    60, // keep结点数量超过Core时的时间(以秒计)1503939327125指定的网络配置从/sys/class/net/<接口>/carrier中加载1503939327125指定的网络配置从/sys/class/net/<接口>/carrier中加载0, // keepAliveTime  
    TimeUnit.SECONDS, // unit为秒  
    new LinkedBlockingQueue<Runnable>() // 任务队列  
);

workQueue

workQueue是任务队列,用于存放待执行的任务。当线程池中的线程数量小于corePoolSize时,新提交的任务会被放入此队列中等待。如果队列已满,任务会被拒绝。Java中提供了多种类型的任务队列,例如LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue等。

ExecutorService executor = new ThreadPoolExecutor(  
    5, // corePoolSize  
    10, // maximumPoolSize  
    60, // keepAliveTime  
    TimeUnit.SECONDS,  
    new LinkedBlockingQueue<Runnable>(1024) // 任务队列  
);

threadFactory

threadFactory是一个接口,用于创建线程池中的工作线程。默认情况下,线程工厂会创建一个与提交任务线程相同身份的线程。但是,如果需要为线程池中的线程设置一些属性,比如线程名、优先级等,可以自定义threadFactory。

ExecutorService executor = new ThreadPoolExecutor(  
    5, // corePoolSize  
    10, // maximumPoolSize  
    60, // keepAliveTime  
    TimeUnit.SECONDS,  
    new LinkedBlockingQueue<Runnable>(1024), // 任务队列  
    new ThreadFactory() {  
        private int count = 0;  
        @Override  
        public Thread newThread(Runnable r) {  
            count++;  
            Thread thread = new Thread(r);  
            thread.setName("MyThread-" + count);  
            thread.setPriority(Thread.MAX_PRIORITY);  
            return thread;  
        }  
    } // 线程工厂  
);

handler

handler是任务拒绝策略,表示当队列满了并且工作线程大于等于maximumPoolSize时如何来拒绝请求执行的runnable的策略。常见的策略有AbortPolicy(默认策略,直接抛出运行时异常)、CallerRunsPolicy(调用者线程运行任务)、DiscardOldestPolicy(丢弃队列中最老的任务)、DiscardPolicy(直接丢弃任务)。可以通过继承RejectedExecutionHandler接口自定义拒绝策略。

ExecutorService executor = new ThreadPoolExecutor(  
    5, // corePoolSize  
    10, // maximumPoolSize  
    60, // keepAliveTime  
    TimeUnit.SECONDS,  
    new LinkedBlockingQueue<Runnable>(1024), // 任务队列  
    new ThreadFactory(), // 线程工厂  
    new RejectedExecutionHandler() {  
        @Override  
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {  
            System.out.println("Task " + r.toString() + " is rejected.");  
        }  
    } // 拒绝策略  
);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值