java 线程池 参数

		
		int corePoolSize = 2;
		int maximumPoolSize = 10;
		int keepAliveTime = 60;
		TimeUnit unit = TimeUnit.SECONDS;
		ArrayBlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(100);
		
		ThreadFactory factory = new ThreadFactory() {
			@Override
			public Thread newThread(Runnable r) {
				
				return new Thread(r);
			}
		};
		
		RejectedExecutionHandler executionHandler = new RejectedExecutionHandler() {
			
			@Override
			public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
				// TODO Auto-generated method stub
				
			}
		};
		ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 
				keepAliveTime, unit, workQueue, factory, executionHandler);

参数说明从上到下

  1. 线程池核心线程数
  2. 线程池最大线程数
  3. 如果线程超过了核心线程数,那么多的那部分线程的最大空闲存活时间
  4. 时间的单位
  5. 线程池存放任务的队列
  6. 线程池如果创建线程
  7. 线程池不能处理跟过任务的时候,这个handler提供的rejectedExecution方法将会提供给用户来处理这些未被接受的任务、ThreadPoolExecutor提供了默认的处理策略(策略如下)
ThreadPoolExecutor.DiscardOldestPolicy ;	//丢弃队列第一个任务,执行当前任务
ThreadPoolExecutor.DiscardPolicy;			//空实现、不做任何处理(丢弃当前任务)
ThreadPoolExecutor.AbortPolicy;				//抛出异常(丢弃当前任务)
ThreadPoolExecutor.CallerRunsPolicy;		//由调度线程(客户端)执行任务

大概工作原理理解

        当往线程池中提交任务的时候,如果队列数量达到最大了(如上是100,达到100以后执行后面的),那么线程池会开启新的线程来处理线程池中的任务、当队列达到最大,线程数也达到配置提供的最大线程数、那么再往队列提交任务,线程池会拒绝,此刻就有handler来处理了(比如记录日志,或者重试等等)


猜你喜欢

转载自blog.csdn.net/vipagain/article/details/80904770