线程池和阻塞队列

阻塞队列

add/remove

        如果队列满了,add(T)会抛出异常        

        如果队列为空,remove()会抛出异常

offer/poll

        如果队列满了,offer(T)会返回false

        如果队列为空,poll()会返回null

put/take

        如果队列满了,put(T)会阻塞

        如果队列为空,take()会阻塞

常用的阻塞队列

       LinkedBlockingQueue:链表实现的阻塞队列,可以不指定大小,默认为Integer.MAX_VALUE

       ArrayBlockingQueue:数组实现的阻塞队列,必须指定大小

       SynchronousQueue:不能存放元素的阻塞队列

线程池

线程池参数

        corePoolSize:核心线程数

        maximumPoolSize:最大线程数、规定阻塞队列满了之后,允许创建的最大任务个数

        keepAliveTime:线程空闲时间

        unit:线程空闲时间单位

        workQueue:阻塞队列

        threadFactory:线程工厂,主要是给线程指定name

        handler:拒绝策略,默认是抛出异常

                 AbortPolicy:当任务书大于maximumPoolSize+阻塞队列大小之后,会抛出异常

                 DiscardPolicy:抛弃最近提交的任务

                 DiscardOldestPolicy:抛弃最早提交未执行的任务

                 CallerRunsPolicy:由调用线程自己执行该任务,如果是主线程那么就是main

线程池工作原理

·         提交的任务数小于等于核心线程数,会创建核心线程执行任务

         ·提交的任务数大于核心线程数,超出部分会被加入阻塞队列中

         ·阻塞队列如果满了,判断超出的任务数是否大于最大线程数,如果大于那么走拒绝策略,否则执行。

合理配置线程池

CPU密集型

        有大量计算型的任务,最大线程数不要超过逻辑核心数

IO密集型

        有大量磁盘io,网络通讯,最大线程数一般配置为2*逻辑核心数

线程不安全的原因

         java内存模型中,为了提高效率在线程中引入了工作内存和主存,工作内存是线程私有的,两个线程同时要修改一个变量,刚开始都是从主存中拷贝一份副本,然后在工作内存中修改值,在未来某个时间刷新到主存中,由于两个线程都是在自己内部的工作内存修改变量,所以最终刷新到主存中的数据可能是不正确的,这就是线程不安全的原因。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java线程池阻塞队列是用来存储等待执行的任务的数据结构。当线程池中的线程都在执行任务时,新的任务会被放入阻塞队列中等待执行。当线程池中的线程空闲下来时,它们会从阻塞队列中取出任务并执行。 Java中常见的线程池阻塞队列有以下几种: 1. ArrayBlockingQueue:基于数组结构实现的FIFO阻塞队列。在构造该阻塞队列时需要指定队列的容量。当队列已满时,若再次进行数据写入操作,则线程将会进入阻塞,一直等待直到其他线程对元素进行消费。当队列为空时,对该队列的消费线程将会进入阻塞,直到有其他线程写入数据[^2]。 2. LinkedBlockingQueue:基于链表结构实现的FIFO阻塞队列。该队列的容量可以选择性地指定,如果不指定,默认大小为Integer.MAX_VALUE。当队列已满时,写入操作将会被阻塞,直到有其他线程从队列中取出元素。当队列为空时,读取操作将会被阻塞,直到有其他线程写入数据。 3. SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等待另一个线程的移除操作,反之亦然。当线程尝试插入元素时,如果没有其他线程正在等待移除元素,则插入操作将会失败。当线程尝试移除元素时,如果没有其他线程正在等待插入元素,则移除操作将会失败。 这些阻塞队列在Java线程池中起到了重要的作用,可以根据实际需求选择适合的阻塞队列来管理任务的执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值