zoukankan      html  css  js  c++  java
  • 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密集

  • 相关阅读:
    c语言的按位运算符
    数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
    【传感器】BMA253 数字,三轴加速度传感器
    并发编程的几种形式
    php:PHP解析xml的4种方法
    spring boot: 一般注入说明(五) @Component, application event事件为Bean与Bean之间通信提供了支持
    spring boot: 一般注入说明(四) Profile配置,Environment环境配置 @Profile注解
    spring boot: Bean的初始化和销毁 (一般注入说明(三) AnnotationConfigApplicationContext容器 JSR250注解)
    spring boot: EL和资源 (一般注入说明(二) @Service注解 @Component注解)
    spring boot: scope (一般注入说明(一) @Autowired注解)
  • 原文地址:https://www.cnblogs.com/wanwusheng/p/6376311.html
Copyright © 2011-2022 走看看