• Java底层技术系列文章-线程池框架


    一、线程池结构图
        threadpool1

    二、示例

    定义线程接口

    public class MyThread extends Thread {
    @Override
    publicvoid run() {
    System.out.println(Thread.currentThread().getName() + "正在执行");
    }
    }
     

    1:newSingleThreadExecutor

    ExecutorService pool = Executors. newSingleThreadExecutor();

    Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    Thread t3 = new MyThread();
    //将线程放入池中进行执行
    pool.execute(t1);
    pool.execute(t2);
    pool.execute(t3);
    //关闭线程池
    pool.shutdown();

    输入结果:
    pool-1-thread-1正在执行
    pool-1-thread-1正在执行
    pool-1-thread-1正在执行

    2:newFixedThreadPool

    ExecutorService pool = Executors.newFixedThreadPool(3);
    Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    Thread t3 = new MyThread();
    Thread t4 = new MyThread();
    Thread t5 = new MyThread();
    //将线程放入池中进行执行
    pool.execute(t1);
    pool.execute(t2);
    pool.execute(t3);
    pool.execute(t4);
    pool.execute(t5);
    pool.shutdown();

    输入结果:
    pool-1-thread-1正在执行
    pool-1-thread-2正在执行
    pool-1-thread-1正在执行
    pool-1-thread-2正在执行

    3 :newCachedThreadPool

    ExecutorService pool = Executors.newCachedThreadPool();
    Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    Thread t3 = new MyThread();
    Thread t4 = new MyThread();
    Thread t5 = new MyThread();
    //将线程放入池中进行执行
    pool.execute(t1);
    pool.execute(t2);
    pool.execute(t3);
    pool.execute(t4);
    pool.execute(t5);
    //关闭线程池
    pool.shutdown();

    输入结果:
    pool-1-thread-2正在执行
    pool-1-thread-4正在执行
    pool-1-thread-3正在执行
    pool-1-thread-1正在执行
    pool-1-thread-5正在执行

    4 :ScheduledThreadPoolExecutor

    ScheduledExecutorService pool = Executors.newScheduledThreadPool(2);
    pool.scheduleAtFixedRate(new Runnable() {//每隔一段时间就触发异常
    @Override
    public void run() {
    //throw new RuntimeException();
    System.out.println("================");
    }
    }, 1000, 2000, TimeUnit.MILLISECONDS);
    pool.scheduleAtFixedRate(new Runnable() {//每隔一段时间打印系统时间,证明两者是互不影响的
    @Override
    public void run() {
    System.out.println("+++++++++++++++++");
    }
    }, 1000, 2000, TimeUnit.MILLISECONDS);

    输入结果:

    ================
    +++++++++++++++++
    +++++++++++++++++
    +++++++++++++++++

    三、线程池核心参数
    corePoolSize : 池中核心的线程数
    maximumPoolSize : 池中允许的最大线程数。
    keepAliveTime : 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。
    unit : keepAliveTime 参数的时间单位。
    workQueue : 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。
    threadFactory : 执行程序创建新线程时使用的工厂。
    handler : 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。
    ThreadPoolExecutor :Executors类的底层实现。

    3.1 任务排队机制
    SynchonousQueue: 同步队列,队列直接提交给线程执行而不保持它们,此时线程池通常是无界的
    LinkedBlockingQueue: 无界对列,当线程池线程数达到最大数量时,新任务就会在队列中等待执行,可能会造成队列无限膨胀
    ArrayBlockingQueue : 有界队列,有助于防止资源耗尽,一旦达到上限,可能会造成新任务丢失
    注意:
    newSingleThreadExecutor、newFixedThreadPool使用的是LinkedBlockingQueue
    newCachedThreadPool 使用的是 SynchonousQueue
    newScheduledThreadPool使用的是 DelayedWorkQueue

    3.2 线程执行流程
    threadpool2 

    3.3 线程大小确定:
    cpu密集型: 尽量少开线程,最佳线程数 Ncpu+1
    io密集型:多开线程,2Ncpu
    混合型:根据情况而定,可以拆分成io密集和cou密集

  • 相关阅读:
    理想解法
    IEEExtreme 2021
    day_1-python前期学习准备篇
    电梯模拟C++
    java线程_01——————————HelloWorld例子
    Unknown tag (c:forEach) 未知的标签
    自动生成Junit单元测试的插件 CodeProAnalytix
    Log4j笔记----01
    Springboot学习笔记_helloWorld篇
    支持开源,崇尚技术,追求真理,充实人生
  • 原文地址:https://www.cnblogs.com/wanwusheng/p/6376311.html
Copyright © 2020-2023  润新知