线程池介绍及用法

一、概念:

提供一组线程,让这些线程来执行各个任务,每执行一个任务便会用一个线程。线程池可以便于重复利用线程、便于统一管理线程

二、jdk提供的线程池api:

1、ExecutorService:

真正的线程池接口,有子类ThreadPoolExecutor

2、Executors:

工具类、工厂类。用于创建各种不同类型的线程池(定长、单一、缓存、定时及周期性),指向给ExecutorService。底层都是对ThreadPoolExecutor的构造方法进行封装。

详情见:https://blog.csdn.net/csucsgoat/article/details/124139094

三、ThreadPoolExecutor

1、五个核心构造参数

/**
 * corePoolSize    核心线程数(线程池刚实例化时就初始化的线程数)
 * maximumPoolSize 线程池中允许的最大线程数量
 * keepAliveTime   非核心线程处于空间状态存在时间
 * unit            keepAliveTime 的时间单位
 * workQueue       用来储存等待执行任务的队列
 */
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

2、常用的执行命令

void execute(Runnable command);  //参数是Runnable ,无返回值

Future<?> submit(Runnable task);  //参数可以是Runnable、Callable,有返回值

3、常用的关闭命令

如果使用的线程池核心线程数不为0,建议在使用完后将线程池关闭。因为核心线程会占用内存资源

//用此方法后继续提交新任务会抛异常,等待队列中的任务任然继续执行,正在执行的任务不会被中断
void shutdown();  

//用此方法后继续提交新任务会抛异常,等待队列中的任务不会继续执行并且队列中没执行的任务会返回给list,正在执行的任务会被中断
List<Runnable> shutdownNow();  

详情见:https://blog.csdn.net/qq_36691683/article/details/84856516

四、线程池工作流程

在这里插入图片描述

五、简单代码样例

public String testExecutor() throws InterruptedException {

    ExecutorService service = new ThreadPoolExecutor(
            100,
            150,
            0L,
            TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(20480000)
    );
    CountDownLatch cdl = new CountDownLatch(100);

    for (int i=0;i<100;i++){
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                //执行业务逻辑

                System.err.println("线程"+Thread.currentThread().getName()+"执行完");

                //计数器递减
                cdl.countDown();
            }
        };


        service.execute(runnable);
    }


    //线程执行完后再执行主线程
    cdl.await();

    //关闭线程池释放资源
    service.shutdown();

    return "ok";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一梦无痕bzy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值