ThreadPoolExecutor原理解析

版权声明:本文为博主原创文章,转载请注明出处!!!小二学堂:https://blog.csdn.net/Mirror_w https://blog.csdn.net/Mirror_w/article/details/91354906

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test {

	public static void main(String[] args) {
		/*
	ThreadPoolExecutor pool1 = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue)
		corePoolSize :核心线程数  maximumPoolSize:最大线程数   keepAliveTime:时间  unit:时间格式    workQueue:阻塞队列   (3) 队列长度
		 1、 当用户提交第一个任务时,线程池中核心线程数为1  因此 这个核心线程会立即执行用户所提交的任务
		 2、当用户再次提交新的任务时,若线程池中的核心线程正在执行上次执行的任务时,此时这个任务开始放入阻塞队列中
		  3、放入阻塞队列中的任务等待核心线程的执行,当核心线程执行完毕时,才会执行阻塞队列中的任务。
		 4、若用户又一次提交了新的任务时,队列中再次添加一个待执行任务,队列长度为2,
		 5、当阻塞队列的长度为3时,用户再次提交任务时,由于阻塞队列待执行任务已放满,则线程池会再次创建一个新的线程
		 6、此时线程池中的线程数为2,当线程数大于最大线程数时,线程池就会报错拒绝任务,
		  7、当线程数小于最大线程数时,线程池中的核心线程和新创建的线程会分摊任务 执行待执行任务
		 */
		ThreadPoolExecutor pool = new ThreadPoolExecutor(1, 2, 3, TimeUnit.SECONDS, new LinkedBlockingDeque<>(3));
		
		//提交第一个任务
		pool.execute(new TestThread());
		//再次提交任务,此时会放入队列中 ----此时线程为:pool-1-thread-1
		pool.execute(new TestThread());
		pool.execute(new TestThread());
		pool.execute(new TestThread());
		//当再次放入时,线程池会创建新的线程   此时线程池中的线程数为2
		//---此时创建的新的线程为:pool-1-thread-2
		pool.execute(new TestThread());
		//当再次放入时,线程池会创建新的线程   此时线程池中的线程数为3,大于最大线程数,就会报错 拒绝任务
		pool.execute(new TestThread());
		
		//关闭线程池
		pool.shutdown();
	}
}
class TestThread implements Runnable{

	@Override
	public void run() {
		System.out.println(Thread.currentThread().getName());
	}
	
}

猜你喜欢

转载自blog.csdn.net/Mirror_w/article/details/91354906