Java线程池知识梳理

本文详细介绍了Java线程池的原理与使用,包括Executor接口、ExecutorService、ThreadPoolExecutor等核心类,以及线程池的创建、监控和管理。讨论了线程池的四大优势,并列举了不同类型的线程池如newFixedThreadPool、newCachedThreadPool等的适用场景。
摘要由CSDN通过智能技术生成

Java线程池

前言

平时使用Java线程时,习惯于直接new Thread来创建一个线程,这种创建线程的方法随手就出来了,满足于我们一般的使用场景,但是每次new Thread都会产生一个对象,同时我们也知道这样的线程缺乏有效的管理,由此java推出了线程池,相对于直接new Thread,线程池有以下优点:

  • 降低资源消耗

线程池可利用已存在线程,少了对象的创建,减少了性能开销

  • 可有效管理线程

控制线程数、控制执行规则,控制并发数

Java线程池源码的介绍

前面大概介绍了线程池的优点,那么java中关于线程池的类有哪些?

线程池相关类

接口Executor

java中线程池的接口为Executor,该接口提供了一个void execute(Runnable var1);方法,接受一个Runnable的任务。

package java.util.concurrent;

public interface Executor {
   
    void execute(Runnable var1);
}
子类接口ExecutorService

Executor接口的子类ExecutorService封装了更多的方法:

public interface ExecutorService extends Executor {
   
    void shutdown();//关闭命令,不再接受新的任务 如果还有未执行完的任务,则执行完之后之后关闭

    List<Runnable> shutdownNow();//停止正在执行的任务,不再处理正在等待的任务

    boolean isShutdown();//是否关闭,在调用shutdown之后返回true,其他返回false

    boolean isTerminated();//立即判断 调用shutdown之后,在线程都执行完后返回true,其他返回false

    //在指定时间后,判断是否已经关闭,如果关闭返回true,否则返回false
    boolean awaitTermination(long var1, TimeUnit var3) throws InterruptedException;

    //以下是提交线程的方法
    
    <T> Future<T> submit(Callable<T> var1);

    <T> Future<T> submit(Runnable var1, T var2);

    Future<?> submit(Runnable var1);

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1) throws InterruptedException;

    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException;

    <T> T invokeAny(Collection<? extends Callable<T>> var1) throws InterruptedException, ExecutionException;

    <T> T invokeAny(Collection<? extends Callable<T>> var1, long var2, TimeUnit var4) throws InterruptedException, ExecutionException, TimeoutException;
}

抽象子类AbstractExecutorService

ExecutorService接口的抽象实现类AbstractExecutorService,实现了ExecutorService接口中的提交线程的相关方法:

public abstract class AbstractExecutorService implements ExecutorService {
   
	public Future<?> submit(Runnable var1) {
   
        if(var1 == null) {
   
            throw new NullPointerException();
        } else {
   
            RunnableFuture var2 = this.newTaskFor(var1, (Object)null);
            this.execute(var2);
            return var2;
        }
    }

    public <T> Future<T> submit(Runnable var1, T var2) {
   
        if(var1 == null) {
   
            throw new NullPointerException();
        } else {
   
            RunnableFuture var3 = this.newTaskFor(var1, var2);
            this.execute(var3);
            return var3;
        }
    }

    public <T> Future<T> submit(Callable<T> var1) {
   
        if(var1 == null) {
   
            throw new NullPointerException();
        } else {
   
            RunnableFuture var2 = this.newTaskFor(var1);
            this.execute(var2);
            return var2;
        }
    }
    ...
}
常用的实现子类ThreadPoolExecutor

抽象类AbstractExecutorService的子类ThreadPoolExecutor是我们常用到的一个类,具体实现了上面提到的未实现的方法,并提供了几种构造函数以及额外的判断方式,比如线程池大小、队列等,源码如下:


package java.util.concurrent;

public class ThreadPoolExecutor extends AbstractExecutorService {
   
    ...
        
    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue) {
   
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值