workQueue:一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,一般来说,这里的阻塞队列有以下几种选择: ArrayBlockingQueue; LinkedBlockingQueue;SynchronousQueue; ArrayBlockingQueue和PriorityBlockingQueue使用较少,一般使用LinkedBlockingQueue和Synchronous。线程池的排队策略与B...
}publicstaticvoidtestThreadPoolExecutor()throwsException {//基础参数intcorePoolSize=2;//最小活跃线程数intmaximumPoolSize=5;//最大活跃线程数intkeepAliveTime=5;//指定线程池中线程空闲超过 5s 后将被回收TimeUnit unit = TimeUnit.SECONDS;//keepAliveTime 单位//阻塞队列BlockingQueue<Runnable> workQueue ...
三、使用 ThreadPoolExecutor 自定义线程池参数 创建1 11个线程池 , 核心线程数是2 22, 最大线程数是3 33, 则非核心线程 0 ~ 1 个 , 非核心线程最大空闲存活时间 60 秒 , 阻塞队列最大存放 10 个元素 , 拒绝策略设置为抛出异常方式 , 如果阻塞队列装满 , 再次尝试执行新任务时 , 会抛出异常 ; 代码...
功能:当触发拒绝策略时,只要线程池没有关闭,就由提交任务的当前线程处理。 使用场景:一般在不允许失败的、对性能要求不高、并发量较小的场景下使用,因为线程池一般情况下不会关闭,也就是提交的任务一定会被运行,但是由于是调用者线程自己执行的,当多次提交任务时,就会阻塞后续任务执行,性能和效率自然就慢了。 Abort...
当线程数量达到corePoolSize,且workQueue队列塞满任务了之后,继续创建线程,当线程池中的线程数量到达这个数字时,新来的任务会执行拒绝策略。 keepAliveTime:表示线程没有任务执行时最多能保持多少时间会被回收,注意,这个参数控制的是超过corePoolSize之后的“临时线程”的存活时间。 unit:参数 keepAliveTime 的时间单位...
线程池的饱和策略,当阻塞队列满了,且没有空闲的工作线程,如果继续提交任务,必须采取一种策略处理该任务。 5)、线程池的饱和策略 1)AbortPolicy 直接抛出异常,默认策略; 2)CallerRunsPolicy 用调用者所在的线程来执行任务 3)DiscardOldestPolicy 丢弃阻塞队列中靠最前的任务,并执行当前任务 ...
RejectedExecutionHandler:拒绝策略,每次看到Handler类,可以任务这是一种策略。这里主要指当线程池满了(满负荷工作或阻塞),工作队列也满了,如何拒绝新的任务。 3、线程池分类 我们上面在Excutors类中已经看到了常用的几种线程池类型。 newFixedThreadPool
Java 中的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。 void interrupt() :中断线程,例如,当线程A运行时,线程B可以调用钱程interrupt() 方法来设置线程的中断标志为true 并立即返回。设置标志仅仅是设置标志, 线程A实际并没有被中断, ...
(拒绝策略:当队列里面放满了任务、最大线程数的线程都在工作时,这时继续提交的任务线程池就处理不了,应该执行怎么样的拒绝策略。) 7 个参数介绍完了,我希望当面试官问你自定义线程池可以指定哪些参数的时候,你能回答的上来。 当然,不能死记硬背,这样回答起来磕磕绊绊的,像是在背书。也最好别给我回答什么:我...
线程集合(workers):存放执行任务的线程,是一个HashSet; 2)任务等待队列(workQueue):存放等待线程池调度执行的任务,是一个阻塞式队列BlockingQueue; 关闭线程池时有两个关键步骤: 1)修改线程池状态到SHUTDOWN,这时新提交到线程池的任务都会被直接拒绝; 2)中断线程池中的所有线程,中断任务执行回收线程集合中所有线程...