Java中如何优雅的使用线程池?

本文探讨了为何要使用线程池,指出线程过多会消耗内存和影响性能。线程池包括线程池管理器、工作线程、任务接口和任务队列四个部分。介绍了ExecutorService和ScheduledExecutorService等接口及newFixedThreadPool、newCachedThreadPool等线程池创建方法。建议根据任务类型设置线程池大小,如CPU密集型应用为N+1,IO密集型为2N+1。
摘要由CSDN通过智能技术生成

为什么要用线程池?

线程是不是越多越好?

  1. 线程在java中是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间+小会时间>执行任务时间就很不合算。
  2. java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,一个线程默认最大栈大小1M,这个栈空间是需要从系统内存中分配的。线程过多,会消耗很多的内存。
  3. 操作系统需要频繁切换线程上下文(每个线都想被运行),影响性能。

线程池的推出,就是为了方便边的控制线程数量。

线程池

线程池基本概念

线程池包括以下四个基本组成部分:

  1. 线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;
  2. 工作线程:线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
  3. 任务接口:每个任务必须实现的借口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;
  4. 任务队列:用于存放没有处理的任务。提供一种缓冲机制。

线程池接口定义和实现类 

可以认为ScheduledThreadPoolExector是最丰富的实现类。

ExecutorService

 

public interface ExecutorService extends Executor {
    /**
     * 优雅关闭线程池,之前提交的任务将被执行,但是不会接受新的任务。
     */
    void shutdown();

    /**
     * 尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行任务的列表。
     */
    List<Runnable> shutdownNow();

    /**
     * 如果此线程池已关闭,则返回true.
     */
    boolean isShutdown();

    /**
     * 如果关闭后的所有任务都已完成,则返回true
     */
    boolean isTerminated();

    /**
     * 监测ExecutorService是否已经关闭,直到所有任务完成执行,或超时发生,或当前线程被中断。
     */
    boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;

    /**
     * 提交一个用于执行的Callable返回任务,并返回一个Future,用于获取Callable执行结果。
     */
    <T> Future<T> submit(Callable<T> task);

    /**
     * 提交可运行任务以执行,并返回Future,执行结果为传入的result
     */
    <T> Future<T> submit(Runnable task, T result);

    /**
     * 提交可运行任务以执行,并返回Future对象,执行结果为null
     */
    Future<?> submit(Runnable task);

    /**
     * 执行给定的任务集合,执行完毕后,则返回结果。
     */
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException;

    /**
     * 执行给定的任务集合,执行完毕或者超时后,则返回结果,其他任务终止。
     */
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException;

    /**
     * 执行给定的任务,任意一个执行成功则返回结果,其他任务终止。
     */
    <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException;

    /**
     * 执行给定的任务,任意一个执行成功或者超时后,则返回结果,其他任务终止
     */
    <T> T invokeAny(Collection<? extends Callable<T>> tasks,long timeout, TimeUnit unit)throws InterruptedException, ExecutionException, TimeoutException;
}

ScheduledExecutorService

public interface ScheduledExecutorService extends ExecutorService {

    /**
     * 创建并执行一个一次性任务,过了延迟时间就会被执行
     */
    public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit);

    /**
     * 创建并执行一个一次性任务,过了延迟时间就会被执行
     */
    public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit);

    /**
     * 创建并执行一个周期性任务,过了给定的初始化延迟时间,会第一次被执行。执行过程中发生了异常,那么任务停止
     * 一次任务执行时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倾听铃的声

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值