专栏首页LuckQI学习Java基础知识,打通面试关~十五线程池学习

学习Java基础知识,打通面试关~十五线程池学习

最近开始自己找工作了。虽然一直在写这方面的文章,还是有些知识掌握的不牢固,希望看文章的朋友也有自己的总结认真的学习到这些内容。一起共勉。

做java中经常问道的一个问题就是线程池用过吗?通用的有哪些?如果不用通用的我们应该怎么创建线程池?这些问题。今天自己也做下总结。虽然原先也写过。现在再总结下,让自己能弄明白。

静态创建线程池

我们平常使用的大部分还是依靠java中自带的静态工厂产生的线程池。先了解下自带的线程池。

newFixedThreadPool(int numThreads)

该线程池会在初始化的指定线程数量。具有以下的特点

  1. 在任何时刻都是最多有numThreads的线程数量活动。如果超过限制会在LinkedBlockingQueue中等待。
  2. 当达到核心线程数的时候,线程数不在继续增加。
  3. 有工作线程退出,新的工作线程被创建来达到设置的线程数。
```
    Executors.newFixedThreadPool(1);
    //源码实现
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
```

newCachedThreadPool()

该线程池是一个可以用来缓存的线程池。

  1. 尝试缓存使用过的线程。
  2. 没有缓存的线程池时,就会使用工厂方法创建线程池,最大的容量理论上是Integer.MAX_VALUE。这个跟服务器的配置有关。所以如果过来大量的线程任务,那么该线程池会在瞬间创建多个线程来执行工作。
  3. 时间上多余的线程超过60秒会被终止移除缓存中。
  4. 内部使用的SynchronousQueue实现的队列,该队列在实现的时候没有容量。适合来做交换的工作。
 Executors.newCachedThreadPool();
//源码实现
  public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

newSingleThreadExecutor

该线程池是用来设置单个的线程池,使用的队列是无界队列。

  1. 因为提交的任务只要一个是能活动的,剩下的是放到无界队列中。
  2. 队列是先进先出的。那么执行顺序是有序的。
    Executors.newSingleThreadExecutor();
   //源码
   public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

newWorkStealingPool

工作线程,该线程是在jdk1.8以后新增加的.使用的是ForkJoinPool创建线程池。该任务执行没有顺序。需要考虑到硬件的cpu核心数。

Executors.newWorkStealingPool();
 public static ExecutorService newWorkStealingPool() {
        return new ForkJoinPool
            (Runtime.getRuntime().availableProcessors(),  //默认使用的是硬件的cpu数目
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }
Executors.newWorkStealingPool(10);
  public static ExecutorService newWorkStealingPool(int parallelism) {
        return new ForkJoinPool
            (parallelism,   // 使用的是自定义的核心数
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }

newSingleThreadScheduledExecutor()与newScheduledThreadPool(int poolSize)

周期性的调度执行任务的线程池。 单个执行。

    Executors.newSingleThreadScheduledExecutor();
    public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1));
    }
//核心周期执行的线程数
 Executors.newScheduledThreadPool(10);
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }

了解其java内部的静态线程池,并且在程序中使用其策略。当然在这种我们没有看到的是线程池的拒绝策略。无界队列和有界队列,核心数的与最大的核心数的设置,这些不同。那么我们的执行拒绝策略也是不同的。在接下里的文章我们会具体了解拒绝策略。

本文分享自微信公众号 - LuckQI(YoungRUIQ)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-07-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java多线程技术总结

    用户2196435
  • java多线程技术总结

    用户2196435
  • Java多线程总结三

    用户2196435
  • java并发编程的艺术笔记第八章——java中的并发工具类

    在JDK的并发包里面提供了几个非常有用的并发工具,CountDownLatch、CyclicBarrier、Semaphore工具类提供了一种并发控制流程的手段...

    会跳舞的机器人
  • Java并发编程:线程控制

    在上一篇文章中(Java并发编程:线程的基本状态)我们介绍了线程状态的 5 种基本状态以及线程的声明周期。这篇文章将深入讲解Java如何对线程进行状态控制,比如...

    陈树义
  • 详解Hystrix资源隔离

    在货船中,为了防止漏水和火灾的扩散,一般会将货仓进行分割,避免了一个货仓出事导致整艘船沉没的悲剧。同样的,在Hystrix中,也采用了这样的舱壁模式,将系统中的...

    aoho求索
  • 【小家Java】一次Java线程池误用(newFixedThreadPool)引发的线上血案和总结

    自从最近的某年某月某天起,线上服务开始变得不那么稳定(软病)。在高峰期,时常有几台机器的内存持续飙升,并且无法回收,导致服务不可用。

    YourBatman
  • 多线程实现方式 转

    进程是程序在处理机中的一次运行。一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立。所以进程是重量级的任务,它们之...

    南郭先生
  • 【Android面试】关于多线程,你必须知道的那些玩意儿

    进程和线程作为必知必会的知识,想来读者们也都是耳熟能详了,但真的是这样嘛?今天我们就来重新捋一捋,看看有没有什么知识点欠缺的。

    Android技术干货分享
  • 高并发之——ThreadPoolExecutor类居然是这样保证线程池正确运行的...

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了...

    冰河

扫码关注云+社区

领取腾讯云代金券