Executors线程池创建方式及线程核心参数配置

系列文章目录


前言

为什么要用线程池,因为“池”的思想就是以空间换时间,就像数据库连接池一样,好处就是:1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。2线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Executors常用的线程池类型

newSingleThreadExecutor:创建一个单线程的线程池,此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
newFixedThreadPool:创建固定大小的线程池,每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。
newCachedThreadPool:创建一个可缓存的线程池,此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
newScheduledThreadPool:创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务的需求。
newSingleThreadExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。

二、线程池中队列常用类型

ArrayBlockingQueue 是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
LinkedBlockingQueue 一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于 ArrayBlockingQueueSynchronousQueue 一个不存储元素的阻塞队列。
PriorityBlockingQueue 一个具有优先级的无限阻塞队列。 PriorityBlockingQueue 也是基于最小二叉堆实现
DelayQueue只有当其指定的延迟时间到了,才能够从队列中获取到该元素。
DelayQueue 是一个没有大小限制的队列,
因此往队列中插入数据的操作(生产者)永远不会被阻塞,而只有获取数据的操作(消费
者)才会被阻塞。

三、线程池原理、以及核心参数

1. 最大线程数maximumPoolSize
2. 核心线程数corePoolSize
3. 活跃时间keepAliveTime
4. 阻塞队列workQueue
5. 拒绝策略RejectedExecutionHandler

四、线程池的拒绝策略

1. AbortPolicy:直接丢弃任务,抛出异常,这是默认策略
2. CallerRunsPolicy:只用调用者所在的线程来处理任务
3. DiscardOldestPolicy:丢弃等待队列中最旧的任务,并执行当前任务
4. DiscardPolicy:直接丢弃任务,也不抛出异常

五、java实现创建线程池

1、newFixedThreadPool:创建固定大小的线程池,每次提交一个任务就创建一个线程

package com.zrrd.XianCheng;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class XianChengChi {
    
    
    public static void main(String[] args){
    
    
        // 创建线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
        while(true) {
    
    
            threadPool.execute(new Runnable() {
    
     // 提交多个线程任务,并执行
                @Override
                public void run() {
    
    
                    System.out.println(Thread.currentThread().getName() + " is running ..");
                    try {
    
    
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                }
            });
        } }
    }

在线程池创建了10个固定大小的线程。
在这里插入图片描述
2、newScheduledThreadPool:创建一个大小无限的线程池,此线程池支持定时以及周期性执行任务的需求。核心线程数3个

package com.zrrd.XianCheng;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class XianChengChi02 {
    
    
    public static void main(String[] args) {
    
    
        ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3);
        scheduledThreadPool.schedule(new Runnable(){
    
    
            @Override
            public void run() {
    
    
                System.out.println("延迟三秒");
            }
        }, 3, TimeUnit.SECONDS);
        scheduledThreadPool.scheduleAtFixedRate(new Runnable(){
    
    
            @Override
            public void run() {
    
    
                System.out.println("延迟 1 秒后每三秒执行一次");
            }
        },1,3,TimeUnit.SECONDS);
    }
}

在线程池创建3个核心线程。
在这里插入图片描述


总结

当然这也是实现多线程的方式之一,之所以和之前文档分开写,是因为虽然都能实现多线程能力,但是线程池的思想与配置与其他三种是最主要的区别,线程池的使用非常广,目前我们公司的项目用的就是线程池的策略。

猜你喜欢

转载自blog.csdn.net/zhx__/article/details/119852066