线程池

作者: 策马踏清风 | 来源:发表于2020-08-26 21:31 被阅读0次

    降低线程创建和销毁的消耗,提高速度,节约资源,线程可管理。

    参数含义

    • int corePoolSize核心线程数
    • int maximumPoolSize最大线程数
    • long keepAliveTime空闲线程存活时间
    • workQueue任务队列
    • threadFactory创建线程的工厂,主要赋予名字
    • RejectedExcutionHandler线程池饱和策略
    1. AbortPolicy抛出异常,默认
    2. CallerRunsPolicy调用者线程执行
    3. DiscardOldestPolicy丢弃最老的任务
    4. DiscardPolicy直接丢弃

    实现自己的饱和策略,实现RejectedExcutionHandler就行,保存到数据库之类的。

    提交任务

    • execute(Runnable command)不需要返回
    • Future<T> submit(Callable<T> task)有返回

    最佳线程数

    • CPU密集型,Runtime.getRuntime().availableProcessors() + 1最大核心数+1
    • IO密集型,尽量大,可以是CPU数 * 2

    预定义线程池(全部实现ExecutorService接口)

    • FixedThreadPool
    • SingleThreadExecutor
    • CachedThreadPool
    • WorkStealingPool基于fork/join
    • ScheduledThreadPoolExecutor定时执行的任务,可以指定抛出异常,不影响线程执行。
    • newSingleThreadScheduledExecutor包含一个线程,只需要单个线程执行周期任务,保证任务执行顺序
    1. schedule执行一次,可以延时执行
    2. scheduleAtFixedRate提交固定时间执行任务
    3. scheduleWhithFixedDelay提交固定延时间隔执行的任务
    • scheduleAtFixedRate任务超时,当前一个任务超出下个任务的超时时间,下个任务会在上一个执行后马上执行。

    自定义线程池

    • new ThreadPoolExecutor(...)

    CompletionService

    • 用于接收线程池返回结果(先结束的先拿)
    // 包装线程池
    CompletionService<Integer> cService = new ExcutorCompletionService<>(pool);
    // 提交若干任务
    cService.submit(new WorkTask(..));
    cService.submit(new WorkTask(..));
    // 按照执行速度获取执行结果
    cService.take().get();
    cService.take().get();
    
    • 内部包装了task会将执行成功的结果放到内部维护的队列中。

    相关文章

      网友评论

          本文标题:线程池

          本文链接:https://www.haomeiwen.com/subject/bvgfsktx.html