• Java线程池ThreadPoolExecutor原理和用法


    1.ThreadPoolExecutor构造方法

    public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
            BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
    corePoolSize:核心池的大小;
    maximumPoolSize:线程池最大线程数;
    keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止;
    unit:参数keepAliveTime的时间单位(TimeUnit);
    workQueue:一个阻塞队列,用来存储等待执行的任务;
    threadFactory:线程工厂,主要用来创建线程;
    handler:表示当拒绝处理任务时的策略,有以下四种取值:
    (1)AbortPolicy丢弃任务并抛出RejectedExecutionException异常,默认策略
    (2)DiscardPolicy:也是丢弃任务,但是不抛出异常
    (3)DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务
    (4)CallerRunsPolicy:由调用线程处理该任务(不创建新线程)
     
    2.ThreadPoolExecutor原理
     
    ThreadPoolExecutor创建后,执行execute方法,
    如果运行线程数小于corePoolSize,创建线程执行任务;
    如果运行线程数大于corePoolSize且小于maximumPoolSize,则将任务放到workQueue队列中;
    如果运行线程数大于corePoolSize且小于maximumPoolSize,workQueue队列满了,创建线程执行任务;
    如果运行线程数大于corePoolSize且等于maximumPoolSize,workQueue队列满了,执行拒绝策略(默认策略是抛出异常停止运行);
     
    3.ThreadPoolExecutor用法
    ThreadPoolExecutor构造方法参数比较多,每个参数设置需要一定的经验。一般情况下可以使用Executors类来创建:
     
    newSingleThreadExecutor()   创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
    newFixedThreadPool(int nThreads) 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
    newCachedThreadPool() 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲(60秒无任务)线程,若无可用线程,则新建线程。
     
    (1)新建Task类
    package com.xkzhangsan.threads.pool;
    
    public class Task implements Runnable{
        
        private String name;
    
        public Task(String name) {
            super();
            this.name = name;
        }
    
        @Override
        public void run() {
            System.out.println("task:"+name+" start...");
        }
    
    }

    (2)创建测试类使用Executors.newCachedThreadPool() 创建线程池。

    package com.xkzhangsan.threads.pool;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ThreadPoolExecutor;
    
    public class Main {
        
        public static void main(String[] args) {
            ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();
            for (int i = 0; i < 10; i++) {
                Task task = new Task("task"+i);
                executor.execute(task);
            }
        }
    
    }

    (3)测试结果

    task:task0 start...
    task:task1 start...
    task:task2 start...
    task:task3 start...
    task:task4 start...
    task:task5 start...
    task:task6 start...
    task:task7 start...
    task:task9 start...
    task:task8 start...
     
    寻找撬动地球的支点(解决问题的方案),杠杆(Java等编程语言)已经有了。xkzhangsan
  • 相关阅读:
    以中间件,路由,跨进程事件的姿势使用WebSocket
    傻瓜式解读koa中间件处理模块koa-compose
    企业管理系统前后端分离架构设计 系列一 权限模型篇
    vue权限路由实现方式总结
    3YAdmin-专注通用权限控制与表单的后台管理系统模板
    lazy-mock ,一个生成后端模拟数据的懒人工具
    vue-quasar-admin 一个包含通用权限控制的后台管理系统
    CSS中line-height与vertical-align
    IdentityServer4实现Token认证登录以及权限控制
    利用AOP实现SqlSugar自动事务
  • 原文地址:https://www.cnblogs.com/xkzhangsanx/p/10787248.html
Copyright © 2020-2023  润新知