线程池介绍及用法

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。线程池介绍及用法,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、概念:

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

二、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";
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153404.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!