网站中的表格,网站词库怎么做,深圳做营销网站公司,WordPress4.5取消了前言
直接点题
核心线程数 - corePoolSize
最大线程数 - maximumPoolSize
空闲线程存活时间 - keepAliveTime
存活时间单位 - unit
任务队列 - workQueue
线程工厂 - threadFactory
拒绝策略- handler 概念 什么是池#xff1f;
池#xff08;Pool#xff09;…前言
直接点题
核心线程数 - corePoolSize
最大线程数 - maximumPoolSize
空闲线程存活时间 - keepAliveTime
存活时间单位 - unit
任务队列 - workQueue
线程工厂 - threadFactory
拒绝策略- handler 概念 什么是池
池Pool可以把它理解为一个容器里面装着各种我们所需要的资源我们需要资源的时候去这个容器里面拿而不需要每次使用的时候去创建从而达到一个复用的效果提高资源可利用率。
线程池的概念
线程池是一种多线程处理形式处理过程中将任务添加到队列然后在创建线程后自动启动这些任务。简单点理解就是在需要使用多线程执行任务的时候不需要进行线程的创建而是把任务提交到线程池中由线程池按照一定的规则处理。 详解
1 corePoolSize核心线程数
corePoolSize表示核心线程数核心线程数是指线程池中始终保持着活动的线程数量可以这么理解就算线程池中没有任务执行线程为空闲状态也不会被回收。
但是也有可以被回收的情况例如我们设置线程池中 allowCoreThreadTimeOut 为 true 那么核心线程数也会因为超过一定的阈值而被回收设置 allowCoreThreadTimeOut 的案例如下
public class PoolTest {public static void main(String[] args) {// 创建一个阻塞队列用于存放等待执行的任务BlockingQueueRunnable queue new LinkedBlockingQueue(10);// 创建自定义的线程池设置核心线程数、最大线程数、等待时间、时间单位、任务队列等参数ThreadPoolExecutor executor new ThreadPoolExecutor(5, 10, 1, TimeUnit.MINUTES, queue);// 提交任务给线程池使用 execute() 方法提交for (int i 0; i 10; i) {Runnable task new MyTask(i);executor.execute(task);}// 设置为 true 那么一些空闲的核心线程可能会在超过一分钟之后被回收掉executor.allowCoreThreadTimeOut(true);// 关闭线程池executor.shutdown();}}
class MyTask implements Runnable {private final int taskId;public MyTask(int taskId) {this.taskId taskId;}SneakyThrowsOverridepublic void run() {Thread.sleep(2000);System.out.println(Task ID : taskId 执行 Thread.currentThread().getName());}
} 2 maximumPoolSize最大线程数
线程池中允许的最大线程数量包括核心线程和额外创建的临时线程数量。
在向线程池中提交任务的时假如当前的任务数量超过了corePoolSize核心线程数同时workQueue任务队列也满了那么就会根据需要来创建corePoolSize核心线程数之外的临时线程数但 corePoolSize核心线程数和 临时线程数总数不能超过maximumPoolSize最大线程数。 3 keepAliveTime空闲的线程存活时间
它表示当线程处于空闲状态的时候或没有任务执行时线程可额外存活的时间如果这段额外的时间没有需要处理的任务那么超过这个时间空闲的线程就会被终止并从线程池中移除。例如上面的例子设置的是1分钟超时时间可以自己设置空闲时间超过一分钟线程就会被回收掉。
4 unit时间单位
是用于表示线程池中时间单位的枚举类型提供了一个枚举类 java.util.concurrent.TimeUnit 可以配置枚举类中任意一种例如 TimeUnit.SECONDS 秒TimeUnit.MINUTES 分钟TimeUnit.HOURS 小时TimeUnit.DAYS 天 等配合 keepAliveTime空闲的线程存活时间进行使用。 5 workQueue任务队列
用于存储线程池中待执行任务的阻塞队列通常下线程池中任务数量超过了 corePoolSize核心线程数时那么新提交的任务就会被放至 workQueue任务队列当中例如上面案例设置的任务队列大小为10核心线程数为 5当线程池正在执行的任务超过5的时候就会把新提交的任务暂放至任务队列当中任务队列当中等待的任务最多为10个。
线程池的工作队列当中可以是不同的阻塞队列案例中使用的是 LinkedBlockingQueue常用的阻塞队列有 LinkedBlockingQueue一个基于链表结构的可选有界阻塞队列按照先进先出的顺序进行任务调度。如果不指定容量大小则默认为 Integer.MAX_VALUE。 PriorityBlockingQueue一个基于优先级的无界阻塞队列可以按照自定义的顺序执行任务。 SynchronousQueue一个不存储元素的阻塞队列每个插入操作必须等待另一个线程的移除操作。在这种队列中每个插入操作都会阻塞直到有其他线程来获取数据。 ArrayBlockingQueue一个基于数组结构的有界阻塞队列按照先进先出FIFO的顺序进行任务调度。
6 handler拒绝策略
用来处理线程池中的workQueue任务队列已满、并且线程池中的线程数已达到maximumPoolSize最大线程数时的情况线程池会根据定义的拒绝策略来处理这些任务。
内置的拒绝策略有以下几种 AbortPolicy直接抛出 RejectedExecutionException 异常表示无法接受新任务没有配置拒绝策略默认为该策略。 CallerRunsPolicy将任务回退到调用者所在线程中执行也就是由调用 execute 方法的线程来执行该任务。 CallerRunsPolicy将任务回退到调用者所在线程中执行也就是由调用 execute 方法的线程来执行该任务。 DiscardPolicy直接丢弃无法处理的任务不做任何处理。 DiscardOldestPolicy丢弃添加到工作队列最早的任务并尝试重新提交当前任务。 7 threadFactory创建线程工厂
用来创建线程工厂的类在线程池中需要创建新线程时使用 threadFactory创建线程工厂 进行创建线程对象可以通过自定义 threadFactory创建线程工厂对线程进行个性化配置和定制例如设置线程的名称、优先级等可以更好的跟踪和管理线程池中的线程例如以下案例给线程池中线程进行命名。
public class PoolTest {public static void main(String[] args) {int corePoolSize 5;int maximumPoolSize 10;long keepAliveTime 1;TimeUnit unit TimeUnit.MINUTES;BlockingQueueRunnable workQueue new LinkedBlockingQueue();ThreadFactory threadFactory new MyThreadFactory(); // 自定义的ThreadFactoryThreadPoolExecutor executor new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory);// csdn 骑电动车的小黄for (int i 0; i 10; i) {// 提交任务到线程池executor.execute(new Runnable() {Overridepublic void run() {// 任务逻辑代码System.out.println(开始执行任务 线程的自定义名称为 Thread.currentThread().getName());}});}// 关闭线程池...executor.shutdown();}}
class MyThreadFactory implements ThreadFactory {private static final String THREAD_NAME_PREFIX 这是一个线程自定义名称-;private int counter 1;Overridepublic Thread newThread(Runnable r) {Thread thread new Thread(r);thread.setName(THREAD_NAME_PREFIX counter);thread.setPriority(Thread.NORM_PRIORITY);thread.setDaemon(false);counter;return thread;}
}