java线程池(1)----初识线程池

本文介绍了Java线程池的技术背景及优点,详细解析了线程池框架Executor的组成,并阐述了线程池的具体实现类ThreadPoolExecutor的工作过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程池的技术背景
在面向兑现编程中,创建和销毁对象是很费时间的,因为创建一个对象要获得内存资源或资源。在java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。
所以提高服务器程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些“池化资源”技术产生的原因。

线程池的优点:
1.重用线程池中的线程,减少因对象创建、销毁所带来的性能开销。
2.能有效的控制线程的最大并发数,提高系统资源利用率,同时避免过多的资源竞争,避免阻塞。
3.能够对多线程进行简单的管理,使线程的使用简单、高效。

线程池框架Executor
java中的线程池是通过Executor(执行器)框架实现的,Executor框架包括类:Executor,Executors,ExecutorService,ThreadPoolExecutor,Callable和Future,FutureTask的使用等。
这里写图片描述
Executor:所有线程池的接口,只有一个方法。

public interface Executor{
    void executor(Runnable command);
}

ExecutorService:增加Executor的行为,是Executor实现类的最直接接口。
Executors:提供了一系列工厂方法用于创建线程池,返回的线程池都实现了ExecutorService。
ThreadPoolExecutor:线程池的具体实现类,一般用的各种线程池都是基于这个类实现的。

构造方法如下:

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue){
    this(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,Executors.defaultThreadFactory(),defaultHandler);
}

参数含义:
*corePoolSize:线程池的核心线程数,线程池中运行的线程数永远不会超过corePoolSize个,默认情况下可以一直存活。可以通过设置allowCoreThreadTimeOut为true,此时核心数量就是0,此时keepAliveTime控制所有线程的超时时间。

*keepAliveTime:指的是空闲线程结束的超时时间。

*maximumPoolSize:线程池允许的最大线程数。

*unit:是一个枚举,表示keepAliveTime的单位。

*workQueue:表示存放的BlockingQueue队列。

*BlockingQueue:阻塞队列是java.util.concurrent下的主要用来控制线程同步的工具。如果BlockingQueue是空的,从BlockingQueue取东西的操作将被阻塞进入等待状态,直到BlockingQueue进了东西才会被唤醒。同时,如果BlockingQueue是满的,如何试图往里存东西的操作也会被阻塞进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作。

阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只是从容器里拿元素。具体的实现类有LinkedBlockingQueue,ArrayBlockingQueue等。一般其内部的都是通过Lock和Condition(显示锁(lock))来实现阻塞和唤醒。

线程池的工作过程如下:
*线程池刚创建时,里面没有一个线程。任务是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。

*当调用execute()方法添加一个任务时,线程池会做如下判断:
1.如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务;
2.如果正在运行的线程数量大于或者等于corePoolSize,那么将这个任务放入队列;
3.如果这时候队列满了,而且正在运行的线程数量小于maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
4.如果队列满了,而且正在运行的线程数量大于或等于maximumPoolSize,那么线程池会抛出RejectExecutionException。

*当一个线程完成任务时,它会从队列中取下一个任务来执行。

*当一个线程无事可做,超过一定的时间(keepAliveTime)时,线程池会判断,如果当前运行的线程数大于corePoolSize,那么这个线程就被停掉。所以线程池的所有任务完成后,它最终会收缩到corePoolSize的大小。

本次小结就到这里,希望可以帮到大家!
以后还会继续整理有关的知识!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值