• 线程池


        线程池的优势:

    线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程的数量超过最大数量超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。

    线程池的特点:线程复用,控制最大并发数,管理线程

    一    降低资源消耗

    二    提高响应速度

    三    提高线程的可管理性

    查看底层CPU的核数

    System.out.println(Runtime.getRuntime().availableProcessors());

    线程池的架构

    java中的线程池是通过Executor框架实现的,该框架中用到了Executor,Execut,ExecutorService,ThreadPoolExecutor这几个类。

    Executors.newWorkStealingPool(int)->java8新增,使用目前机器上的可用的处理器作为它的并行级别。

    多线程的实现方式

    第四种获得,使用java多线程的方式,线程池 Executors
    * 第一种继承Thread类
    * 第二种实现runnable接口,没有返回值,不抛异常
    * 第三种实现callable接口,有返回值,会抛出异常

    三种线程池的实现方式

    ExecutorService executorService= Executors.newFixedThreadPool(5);//一池五个线程
    ExecutorService executorService= Executors.newSingleThreadExecutor();//一池一个线程
    ExecutorService executorService= Executors.newCachedThreadPool();//一池多线程

    线程池的几个重要参数介绍

    线程池ThreadPoolExecutor底层的七大参数

    5个参数的ThreadPoolExecutor方法

    public ThreadPoolExecutor(int corePoolSize, //线程数,相当于银行的开放的窗口数
                              int maximumPoolSize,// 最大的线程数,相当于银行可以开放的最多的窗口数
                              long keepAliveTime,// 多余的空闲线程存活的时间
                              TimeUnit unit,// 空闲的线程可以存活的时间
                              BlockingQueue<Runnable> workQueue)// 阻塞队列,相当于银行的等候大厅

     {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

    7个参数的ThreadPoolExecutor方法

    public ThreadPoolExecutor(int corePoolSize,//线程数,相当于银行的开放的窗口数
                              int maximumPoolSize, //最大的线程数,相当于银行可以开放的最多的窗口数
                              long keepAliveTime, //多余的空闲线程存活的时间
                              TimeUnit unit, //空闲的线程可以存活的时间
                              BlockingQueue<Runnable> workQueue, //阻塞队列,相当于银行的等候大厅
                              ThreadFactory threadFactory, //线程工厂,一般用默认的方式,相当于银行的ID标识
                              RejectedExecutionHandler handler) //拒绝策略,有四种拒绝方法

    {
        if (corePoolSize < 0 ||
            maximumPoolSize <= 0 ||
            maximumPoolSize < corePoolSize ||
            keepAliveTime < 0)
            throw new IllegalArgumentException();
        if (workQueue == null || threadFactory == null || handler == null)
            throw new NullPointerException();
        this.acc = System.getSecurityManager() == null ?
                null :
                AccessController.getContext();
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.workQueue = workQueue;
        this.keepAliveTime = unit.toNanos(keepAliveTime);
        this.threadFactory = threadFactory;
        this.handler = handler;
    }

    线程池的拒绝策略

    JDK内置的4种拒绝策略:

    AbortPolicy(默认):直接抛出RejectedExecutionException异常组织系统正常运行

    CallerRuncPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。

    DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务。

    DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案。

    JDK四种内置拒绝策略均实现了RejectedExecutionHandler接口。

  • 相关阅读:
    【WCSF】DynamicMethod 的类型所有者无效解决方案
    关于微软企业库查询语句db.ExecuteNonQuery(cmd)返回1的问题
    ASP.NET 如何取得 Request URL 的各個部分
    CSS模拟HTML滚动条
    JavaScript Madness不同的浏览器的keycode比较
    手机身份证IP地址开放接口
    sql添加数据后返回受影响行数据
    jquery下removeClass(“oldClassName”).addClass("newClassName")的问题
    躺着看书!这是所谓 "躺着就能长智慧" 吗?
    在web开发中使用dynsrc被McAfee报木马病毒的解决
  • 原文地址:https://www.cnblogs.com/yutting/p/11493047.html
Copyright © 2020-2023  润新知