线程池的是实现原理

本文介绍了线程池相关知识。线程池可提前创建线程,处理任务后不销毁,能提升频繁创建和销毁线程时的系统性能。Java通过Executors接口提供四种线程池,还阐述了线程池核心任务提交方法execute()的工作原理与步骤。

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

1、什么是线程池

         线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。

2、线程池的分类

      Java通过Executors接口提供四种线程池,分别为:

  • newCachedThreadPool:创建一个可缓存的线程池,如果当前没有可执行任务,在执行结束后缓存60s,如果不被调用则移除线程。调用execute()方法时可以重用缓存中的线程(线程池没有固定大小,为无限大)。适用于很多短期异步任务的环境,可以提高程序性能。
public static ExecutorService newCachedThreadPool() {
      return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
}
  • newFixedThreadPool :创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
  • newScheduledThreadPool :创建一个定长线程池,支持定时及周期性任务执行。
//创建周期性线程池,设置线程池大小
ScheduledExecutorService pool = Executors.newScheduledThreadPool(1);
//设置线程任务,执行延迟时间、执行的周期时间表达式
pool.schedule(callable, delay, unit);
  • newSingleThreadExecutor: 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

3、线程池的工作原理与步骤

(1)execute(Runnable command)(提交任务)

           在ThreadPoolExecutor类中,最核心的任务提交方法是execute()方法,虽然通过submit也可以提交任务,但是实际上submit方法里面最终调用的还是execute()方法,所以我们只需要研究execute()方法的实现

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
         int c = ctl.get();
        if (workerCountOf(c) < corePoolSize) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
    }   

源码解析:

1、如果线程池当前线程数量少于corePoolSize,则addWorker(command, true)创建新worker线程,如创建成功返回,如没创建成功,则执行后续步骤;
    addWorker(command, true)失败的原因可能是:
    A、线程池已经shutdown,shutdown的线程池不再接收新任务
    B、workerCountOf(c) < corePoolSize 判断后,由于并发,别的线程先创建了worker线程,导致workerCount>=corePoolSize
2、如果线程池还在running状态,将task加入workQueue阻塞队列中,如果加入成功,进行double-check,如果加入失败(可能是队列已满),则执行后续步骤;
    double-check主要目的是判断刚加入workQueue阻塞队列的task是否能被执行
    A、如果线程池已经不是running状态了,应该拒绝添加新任务,从workQueue中删除任务
    B、如果线程池是运行状态,或者从workQueue中删除任务失败(刚好有一个线程执行完毕,并消耗了这个任务),确保还有线程执行任务(只要有一个就够了)
3、如果线程池不是running状态 或者 无法入队列,尝试开启新线程,扩容至maxPoolSize,如果addWork(command, false)失败了,拒绝当前command

内容概要:本文详细探讨了双馈风力发电机(DFIG)在Simulink环境下的建模方法及其在不同风速条件下的电流与电压波形特征。首先介绍了DFIG的基本原理,即定子直接接入电网,转子通过双向变流器连接电网的特点。接着阐述了Simulink模型的具体搭建步骤,包括风力机模型、传动系统模型、DFIG本体模型和变流器模型的建立。文中强调了变流器控制算法的重要性,特别是在应对风速变化时,通过实时调整转子侧的电压和电流,确保电流和电压波形的良好特性。此外,文章还讨论了模型中的关键技术和挑战,如转子电流环控制策略、低电压穿越性能、直流母线电压脉动等问题,并提供了具体的解决方案和技术细节。最终,通过对故障工况的仿真测试,验证了所建模型的有效性和优越性。 适用人群:从事风力发电研究的技术人员、高校相关专业师生、对电力电子控制系统感兴趣的工程技术人员。 使用场景及目标:适用于希望深入了解DFIG工作原理、掌握Simulink建模技能的研究人员;旨在帮助读者理解DFIG在不同风速条件下的动态响应机制,为优化风力发电系统的控制策略提供理论依据和技术支持。 其他说明:文章不仅提供了详细的理论解释,还附有大量Matlab/Simulink代码片段,便于读者进行实践操作。同时,针对一些常见问题给出了实用的调试技巧,有助于提高仿真的准确性和可靠性。
Java线程池实现原理主要涉及以下几个关键组件: 1. 任务队列(Task Queue):用于存储待执行的任务线程池中的线程从任务队列中获取任务并执行。 2. 线程池管理器(ThreadPool Manager):负责创建、管理和销毁线程池。它会根据配置的参数(如线程池大小、最大线程数、线程空闲时间等)来控制线程池的行为。 3. 线程池(Thread Pool):由一组复用的线程组成。线程池中的线程可以重复使用,避免了频繁创建和销毁线程的开销。 4. 工作线程(Worker Thread):线程池中的每个线程都是一个工作线程,负责执行从任务队列中获取的任务线程池实现原理如下: 1. 初始化线程池线程池管理器根据配置参数初始化一定数量的工作线程,并将它们加入线程池中。 2. 提交任务:当有任务需要执行时,将任务提交给线程池管理器。 3. 任务队列管理:线程池管理器将任务加到任务队列中。 4. 工作线程执行任务:空闲的工作线程从任务队列中获取任务,并执行任务。 5. 监控线程状态:线程池管理器会监控工作线程的状态,如空闲时间、线程池大小等。 6. 线程回收:当线程池中的线程空闲时间超过设定的阈值时,线程池管理器可能会销毁一些空闲的线程,以减少资源占用。 Java线程池实现原理可以优化多线程的管理和资源利用,避免了频繁创建和销毁线程的开销,提高了系统的性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值