浅谈对jdk线程池的理解

说到线程池我们先来看看java中的常用阻塞队列

ArrayBlockingQueue    由数组组成的有界阻塞队列,按照先进先出的原则,并且要求设定初始大小

LikedBlockingQueue  一个由链表组成的无界(因为它的最大值是Integer.Max_Value,所以我把它认为是无界队列)队列

PriorityBlockingQueue 支持优先级排序的无界阻塞队列,默认是自然顺序

DelayQueue 使用优先级队列实现的无界队列,元素要求必需实现Delayed接口

SynchronousQueue 不存储任何元素的阻塞队列

LinkedTranferQueue 一个由链表组成的无界阻塞队列 transfer()必需要等消费者消费以后才会有返回值,TryTransfer()马上就有返回值

LinkedBlockingQueue 链表组成的双向阻塞队列

 

常用方法

方法

抛出异常

返回值一直阻塞

超时推出

插入addofferputoffer(time)
移除removepolltakepoll(time)
检查elementpeekN/AN/A

 

jdk所有线程池的父类

ThreadPoolExecutor

各个参数含义

int corePoolSize  线程池中的核心线程数

int maximumPoolSize 允许最大的线程数 ,如果BlockingQueue也满了,并且小于它本身的时候就会创建新的线程

long keepAliveTime 线程空闲下来存活的时间,这个参数只有小于corePoolSize的时候才会有用

TimeUnit unit 存活的时间单位

ThreadFactory threadFactory创建线程的工厂,给新建的线程赋予名字

RejectedExecutionHandler handler 饱和策略

             AbortPolicy:直接抛出异常,是属于默认值

            CallerRunsPolicy:用调用者所在的线程来执行任务

             DiscardOldestPolicy :丢弃阻塞队列最老的任务

             DiscardPolicy:丢弃当前任务

 

jdk自带的线程池

Executors

         FixedThreadPool:创建固定线程池数量,使用了无界队列

         SingleThreadExector :创建单个线程,可用于需要保证顺序线程 ,使用了无界队列

         CachedThreadPool:会根据需要来创建新线程,可用于执行短期异步任务

         ScheduledThradPoolExecuto:需要定期执行的任务

合理配置线程池:

根据任务分为:计算密集型,IO密集型和混合型

         cpu核心数:Runtime.getRuntime().availableProcessors()

         对于计算密集型:cpu核心线程+1  

         对于IO密集型:建议使用计算密集数*2

        对于混合型:建议拆分

注意:在使用线程开发的过程中,实现业务为主,不建议为了使用技术而使用技术。

建议使用  ExectorService pool=new ThreadPoolExecutot()这样的方式进行创建,对于RejectedExecutionHandler handler 饱和策略,建议实现RejectedExecutionHandler接口,做自己线程处理:

/**
 * @Author zbf
 * @DATA 2019/9/4 20:21
 * @ClassIntroduction
 */
public class MyThread implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
       //处理自己饱和策略,这里可以保存到数据库中,等待一段时间以后重新运行,也可以直接重新启动一个线程执行
        new Thread(r).start();//建议转型为自己线程,
    }
}

使用队列也建议使用有界队列进行创建,不建议使用无界队列

int cpu = Runtime.getRuntime().availableProcessors();
int corePoolSize=cpu+1;
ExecutorService pool=new ThreadPoolExecutor(corePoolSize*2,corePoolSize*4,3, 
        TimeUnit.SECONDS,new ArrayBlockingQueue<>(300),new ThreadPoolExecutor.DiscardPolicy());

线程提交

execute(Runnable r)

关闭线程池

shutdown():设置线程池的状态,只会中断所有还没有执行完成任务的线程

shutdownNow():设置线程池状态,还会尝试停止正在运行的或者暂停的任务的线程

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值