• 线程池


    线程模型分类:

    用户级线程(User-Level Thread,ULT)
    用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程函数来控制用汉语线程。不需要用户态/内核态切换,速度快。内核对UTL无感知,线程阻塞则进程(包括它的所有线程)阻塞。

    内核级线程(KLT)
    系统内核管理线程,内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建,调度和管理部由内核完成,效率比UTL慢,比进程操作快。

    线程池的意义:
    线程是稀缺资源,他的创建与销毁是比较重且耗资源的操作。而java线程依赖于内核线程,创建线程需要进行操作系统状态切换,为避免资源过度消耗需要设法重用线程执行多个任务。线程池就是一个线程缓存,负责对线程进行统一分配,调优与监控。

    线程池优势:

    • 重用存在的线程,减少线程创建,消亡的开销,提高性能
    • 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行
    • 提高线程的可管理性。线程是稀缺资源,如果无限制的创建不仅仅消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

    线程池五种状态:
    Running:能接收新任务,以及处理已经添加的任务
    Shutdown:不接受新任务,可以处理已经添加的任务
    Stop:不接受新任务,不处理已经添加的任务,并且中断正在处理的任务
    Tidyingd:所有的任务已经终止,ctl记录的任务数量为0(ctl负责记录线程池的运行状态与活动线程数)
    Terminated:线程池彻底终止,则线程池转化为terminated状态

    源码:ThreadPoolExecutor execute

    public void execute(Runnable command) {...
          if (workerCountOf(c) < corePoolSize) {
                if (addWorker(command, true))
                    return;
                c = ctl.get();
            }
    ...}
    addWorker{...
          try {
                w = new Worker(firstTask);
    ...}
    Worker(Runnable firstTask) {
                setState(-1); // inhibit interrupts until runWorker
                this.firstTask = firstTask;
                this.thread = getThreadFactory().newThread(this);
            } //创建线程并运行任务方法
    

    合理配置线程池大小
    处理器核心数:N CPU密集型(计算型)任务:N+1 IO密集型(读写)任务:2N+1

  • 相关阅读:
    【设计模式:单例模式】使用单例模式载入properties文件
    Java 强引用,软引用,弱引用
    sharepreference实现记住password功能
    WWDC2015
    activity之栈管理
    LeetCode:Palindrome Number
    ZOJ 3822 Domination(概率dp)
    WCF报 当前已禁用此服务的元数据发布的错误
    HTML常见标签总结
    xml基础总结
  • 原文地址:https://www.cnblogs.com/leifonlyone/p/12956942.html
Copyright © 2020-2023  润新知