ThreadPoolExecutor原理解析

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());
	}
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadPoolExecutor是一个用于管理线程池的类。它的构造函数和execute方法是源码中的两个重要部分。构造函数用于初始化线程池,而execute方法用于提交任务给线程池进行执行。\[1\] 在构造函数中,我们可以看到线程池的继承关系以及一些参数的设置。另外,Executors类提供了一些线程池的模板供我们使用,而拒绝策略的实现和任务队列BlockingQueue的实现也是构造函数中的重要内容。\[2\] execute方法是用来执行任务的,它的流程包括了一些重要的步骤。首先,它会判断线程池中的线程数量是否小于核心线程数,如果是,则会创建新的线程来执行任务。如果线程池中的线程数量已经达到了核心线程数,那么任务会被添加到任务队列中等待执行。如果线程池中的线程数量小于最大线程数,任务会被创建新的线程来执行。如果线程池中的线程数量已经达到了最大线程数,那么会根据拒绝策略来处理任务。\[3\] 在执行任务的过程中,会调用Worker的run方法来执行任务。Worker的run方法中包含了一些重要的逻辑,比如执行任务前的处理和执行任务后的处理。同时,getTask方法用于获取待执行的任务,其中也涉及到了线程最大空闲时间的设置。最后,拒绝策略会调用handler的rejectedExecution方法来处理被拒绝的任务。\[3\] 通过对ThreadPoolExecutor源码的解析,我们可以更好地理解线程池的工作原理和内部机制。 #### 引用[.reference_title] - *1* *2* *3* [线程池(ThreadPoolExecutor)源码解析](https://blog.csdn.net/li1325169021/article/details/121893030)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值