java threadpool 线程池核心参数
/** * corePoolSize 保留在池中的线程数 即使处于空闲状态 除非设置了allowCoreThreadTimeOut * * maximumPoolSize *池中允许的最大线程数 * * keepalivueTime 存活时间 如果当前线程大于core的数量 * 释放空闲的线程 maximumPoolsize-corePoolSize 只要线程空闲大于指定的keepAlivuetime * unit:时间单位 * BlockingQUeue<Runnable> workQueue 阻塞队列 如果任务有很多 就会将目前多的任务放在队列里面 * 只要有线程空闲,就会去队列里面取出新的任务继续执行 * threadFactory 线程创建工厂 * RejectedExecutionHandler 如果队列满了 按照我们指定得拒绝策略拒绝指定任务 * * 工作顺序 * 1)、线程池创建好 准备好core数量的核心线程,准备接受任务 * 1.1、core满了 就将在进来的任务放入阻塞队列中 空闲的core就会自己去阻塞队列获取任务执行 * 1.2、阻塞队列满了 就直接开新线程执行 最大只能开到max指定数量 * 1.3、max满了就用RejectedExecutionHandler 拒绝任务 * 1.4、max都执行完成,有很多空闲 指定时间以后keepAlivueTime以后 释放max-core(195)这些线程 * * new LinkedBlockingQueue<>() 默认是Integer最大值 内存不够 * * 一个线程池 core:7 max:20 queue:50 100并发进来怎么分配 * 7个会立即得到执行 50个进入队列 再开13个进行执行,剩下的30个就使用拒绝策略 * 如果不想抛弃还要执行 CallerRunsPolicy 同步方式 */ //最原始的方式: ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 200, 10, TimeUnit.SECONDS, new LinkedBlockingDeque<>(100000), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy()); //快速创建线程池 Executors.newCachedThreadPool(); //core是0 所有都可回收 Executors.newFixedThreadPool(10);//固定大小 core=max 都不可以回收 Executors.newScheduledThreadPool(10); //定时任务的线程池 Executors.newSingleThreadExecutor(); //单线程的线程池,后台从队列里面获取任务 挨个执行