JAVA面试题之七—线程池的工作原理和7个参数

线程池的工作原理和7个参数(京东物流、美团充电宝一面、中信银行一面、美团外卖一面、58用户平台一面、轻松集团)

7个参数

  • corePoolSize:线程池核心线程数量
  • maximumPoolSize:线程池最大线程数量
  • keepAliverTime:当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间
  • unit:存活时间的单位
  • workQueue:存放任务的队列
  • threadFactory:创建线程的工厂
  • handler:超出线程范围和队列容量的任务的处理程序
    每个值为什么这么设置?

工作原理

例子:
核心线程数量为5个;全部线程数量为10个;工作队列的长度为5。

刚开始都是在创建新的线程,达到核心线程数量5个后,新的任务进来后不再创建新的线程,而是将任务加入工作队列;

任务队列到达上线5个后,新的任务又会创建新的普通线程,直到达到线程池最大的线程数量10个;

后面的任务则根据配置的饱和策略来处理。我们这里没有具体配置,使用的是默认的配置AbortPolicy:直接抛出异常。

当当前任务小于最大线程数的时候,线程资源会保持核心线程池个数的线程,其他超过的线程资源在存活时间时间之后会被回收。

拒绝策略

1、AbortPolicy:直接抛出异常
2、CallerRunsPolicy:只用调用所在的线程运行任务
3、DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。
4、DiscardPolicy:不处理,丢弃掉。

代码

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


/**
 * 线程池测试
 * 使用丢弃策略处理多余线程,不管多余线程
 */
public class ThreadPoolTest2 {
    
    
	public static void main(String[] args) {
    
    
		LinkedBlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>(5);
		// 丢弃策略,多余的线程直接不处理,丢弃
		RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();
		// 创建线程池 5 10 60s
		ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 60,
				TimeUnit.SECONDS, queue, handler);
		for (int i = 1; i <= 16; i++) {
    
    
			threadPool.execute(new Thread(new ThreadTest(), "Thread".concat(i + "")));
			System.out.println("线程池中活跃的线程数: " + threadPool.getPoolSize());
			if (queue.size() > 0) {
    
    
				System.out.println("-------队列中阻塞的线程数" + queue.size());
			}
		}
		threadPool.shutdown();
	}

}

输出:

com.geniu.concurrent.ThreadPool.ThreadPoolTest2
线程池中活跃的线程数: 1
线程池中活跃的线程数: 2
线程池中活跃的线程数: 3
线程池中活跃的线程数: 4
线程池中活跃的线程数: 5
线程池中活跃的线程数: 5
-------队列中阻塞的线程数1
线程池中活跃的线程数: 5
-------队列中阻塞的线程数2
线程池中活跃的线程数: 5
-------队列中阻塞的线程数3
线程池中活跃的线程数: 5
-------队列中阻塞的线程数4
线程池中活跃的线程数: 5
-------队列中阻塞的线程数5
线程池中活跃的线程数: 6
-------队列中阻塞的线程数5
线程池中活跃的线程数: 7
-------队列中阻塞的线程数5
线程池中活跃的线程数: 8
-------队列中阻塞的线程数5
线程池中活跃的线程数: 9
-------队列中阻塞的线程数5
线程池中活跃的线程数: 10
-------队列中阻塞的线程数5
线程池中活跃的线程数: 10
-------队列中阻塞的线程数5

源码地址:https://github.com/zhongsb/Java-learning
参考:https://www.cnblogs.com/dongguacai/p/6030187.html

猜你喜欢

转载自blog.csdn.net/Prepared/article/details/108899620