zoukankan      html  css  js  c++  java
  • 线程池01-线程池基础知识

    参考书籍:《java并发编程艺术》

    线程池的执行顺序

    线程池的执行逻辑如下:

    • 少于corePoolSize,新建线程任务

    • 等于或多于corePoolSize,则放进BlockQueue存储

    • BlockQueue 存储满的时候,创建新的线程

    • 超过maxmiumPoolSize,拒绝创建,并调用RejectedExecutionHandler.rejectExecutor();

    线程池的创建

    核心参数

     public ThreadPoolExecutor(int corePoolSize,
                                  int maximumPoolSize,
                                  long keepAliveTime,
                                  TimeUnit unit,
                                  BlockingQueue<Runnable> workQueue,
                                  ThreadFactory threadFactory,
                                  RejectedExecutionHandler handler) 
    
    
    1. 当线程数小于corePoolSize,默认是新增一个线程任务创建一个线程,也可以用实例调用prestartAllCoreThread开启所有线程。

    2. ThreadFactory 用于设置创建线程的工厂。

    3. RejectedExecutionHandler当队列线程池满了之后,处理策略。默认是AbortPolicy。抛出异常。

    • AbortPolicy 抛出异常
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
                throw new RejectedExecutionException("Task " + r.toString() +
                                                     " rejected from " +
                                                     e.toString());
            }
    
    • CallerRunsPolicy 当前线程运行任务
     public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
                if (!e.isShutdown()) {
                    r.run();
                }
            }
    
    
    • DiscardOldestPolicy 抛弃现有队列中的最后一个任务
     public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
                if (!e.isShutdown()) {
                    e.getQueue().poll();
                    e.execute(r);
                }
            }
    
    • DiscardPolicy 不处理
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
            }
    
    1. keepAliveTime:线程池的工作空闲之后,存活的时间。

    线程池任务的提交

    • execute方法
    theadPool.execute(new Runnable(){
      run(){
    
      }
    })
    
    
    • submit 方法,有返回值,可以查看返回的结果
    Future<Object> future = executor.submit(harReturnValuetask);      
    try {                       
          Object s = future.get();                
    } catch (InterruptedException e) {     
          // 
    }
    
    

    常用的几种线程池

    • FixedThreadPool

      • 核心线程数和最大线程数一样,小于核心线程,创建新线程执行任务。( 线程数最多不超过核心线程数 );

      • LinkedBlockingQueue是无边界的队列;

      • 空闲的线程会立马停止

    public static ExecutorService newFixedThreadPool(int nThreads) {
            return new ThreadPoolExecutor(nThreads, nThreads,
                                          0L, TimeUnit.MILLISECONDS,
                                          new LinkedBlockingQueue<Runnable>());
        }
    
    • SingleThreadExecutor

      • 只创建一个线程

      • 无边界线程存储多于的线程任务;

      public static ExecutorService newSingleThreadExecutor() {
            return new FinalizableDelegatedExecutorService
                (new ThreadPoolExecutor(1, 1,
                                        0L, TimeUnit.MILLISECONDS,
                                        new LinkedBlockingQueue<Runnable>()));
        }
    
    • CachedThreadPool

      • 核心线程数为0,最大线程数为 最大整数,无边界的。

      • 空闲线程保留60秒

      • SynchronousQueue 是没有容量的工作队列

     public static ExecutorService newCachedThreadPool() {
            return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                          60L, TimeUnit.SECONDS,
                                          new SynchronousQueue<Runnable>());
        }
    
    
  • 相关阅读:
    减少mysql存储列的方法
    Installation of Munin node/master ¶
    they're hiring
    减少mysql存储列的方法
    linux munin 服务器监控 安装配置«海底苍鹰(tank)博客
    用C写apache模块编译教程(经验证)
    SDUT——Kbased Numbers
    【人在运维囧途_06】 借助 sniffer 诊断 Linux 网络故障
    iOS 企业证书发布app 流程
    警告: 隐式声明与内建函数‘exit’不兼容
  • 原文地址:https://www.cnblogs.com/perferect/p/13292265.html
Copyright © 2011-2022 走看看