java并发编程艺术

2021-06-18  本文已影响0人  eliteTyc

synchronized:jvm实现,重量级锁

jvm基于进入和退出实现同步方法和同步代码块

锁的四种状态:按照级别由低到高

原子操作

重排序

如果不希望在处理器编译器优化,可以通过编译器插入内存屏障,达到禁止特定类型的指令重排

线程池

ThreadPoolExecutor executor = new ThreadPoolExecutor(
        10, // 核心线程数
        20, // 最大线程数= 核心线程数+工作线程数
        30, // 工作线程保活时间
        TimeUnit.MINUTES, // 保活时间单位
        new ArrayBlockingQueue<>(10), // 任务队列:当核心线程和工作线程都在处理任务时,其他任务放到该队列
        new MyThreadFactory(), // 创建线程的工场:实现ThreadFactory接口进行实现
        new ThreadPoolExecutor.DiscardPolicy() // 饱和策略
);
class MyThreadFactory implements ThreadFactory{

        @Override
        public Thread newThread(Runnable r) {
            return new Thread(r,"线程-"+r.toString());
        }
    }
// 线程池创建构造函数
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
  1. corePoolSize:核心线程数,不受保活时间影响
  2. maximumPoolSize:最大线程数=核心线程数+工作线程数,当核心线程数和最大线程数设置一样,表示工作线程数为0,即保活时间参数没用
  3. keepAliveTime:工作线程的保活时间
  4. unit:保活时间的单位
  5. workQueue:任务队列,当工作线程和核心线程都在处理任务时,还有新任务,就会添加到这个队列
    • ArrayBlockingQueue:基于数组实现的先进先出队列
    • LinkedBlockingQueue:基于链表的先进先出队列
    • SynchronousQueue:不存储任务的队列,当任务要添加时,必须等到一个线程调用了移除操作,否则添加操作一致阻塞
    • PriorityBlockingQueue:一个具有优先级的无限阻塞队列
  6. threadFactory:线程创建工场
  7. handler:饱和策略,当队列和线程都满了的时候,再添加任务如何进行处理
    • AbortPolicy:直接抛出异常
    • CallRunsPolicy:使用调用者线程来进行处理线程
    • DiscardOldestPolicy:丢弃最旧的任务,也就是队列最前面的任务
    • DiscardPolicy:直接丢弃过来的任务

几种JDK实现的线程池

上一篇 下一篇

猜你喜欢

热点阅读