美文网首页Android座谈会
多线程编程基础(二)-- 线程池的使用

多线程编程基础(二)-- 线程池的使用

作者: ClericYi | 来源:发表于2020-02-07 12:16 被阅读0次

前言

多线程编程基础(一)中,讲到了线程最基本的使用方法。但是在阿里的开发规范上,这是不值得推荐的。可以在idea中下一个Alibaba Java Coding Guidelines,来纠正我们开发时的习惯。

插件的使用效果

思考

  1. 如何使用多线程?
  2. 如此使用多线程开发的好处是什么?

线程池

就上面的第一个问题,我们引入的是一个线程池的概念。想来之前在享元模式中,我们就提及过缓冲池的概念,那么线程池是什么样的呢?

线程池执行模型

从图中我们可以获得信息有

  1. 任务队列:workQueue
  2. 核心线程数:coolPoolSize
  3. 最大线程数:maximumPoolSize
  4. 饱和策略:RejectedExecutionHandler

当然,其实需要的参数还有很多。

// ThreadPoolExecutor的构造函数
ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

线程池分为很多种类,最常用的是这四种:FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPool。

FixedThreadPool

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
}

从填入的函数可以看出最大线程数和核心线程数的数量相同,也就意味着只有核心线程了,多出的任务,将会被放置到LinkedBlockingQueue中。

CachedThreadPool

public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
}

没有核心线程,最大线程数为无穷,也就意味着全部都是非核心线程。这样的线程池更适合去完成大量需要立即处理,但是耗时短的任务。

SingleThreadExecutor

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
}

核心线程数和最大线程数相同,且都为1,也就意味着任务是按序工作的。

ScheduledThreadPool

public static ScheduledExecutorService newScheduledThreadPool(
            int corePoolSize, ThreadFactory threadFactory) {
        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}

public ScheduledThreadPoolExecutor(int corePoolSize,
                                       ThreadFactory threadFactory) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue(), threadFactory);
}

从函数名就已经说明了,是一种定时任务。其实就我的思考,他可以用于实现各种各样功能类似的其他线程池。因为DelayedWorkQueue队列中你可以插入一个立刻需要执行的任务。

使用线程池的好处

  • 线程的复用

每次使用线程我们是不是需要去创建一个Thread,然后start(),然后就等结果,最后的销毁就等着垃圾回收机制来了。
但是问题是如果有1000个任务呢,你要创建1000个Thread吗?如果创建了,那回收又要花多久的时间?

  • 控制线程的并发数

存在核心线程和非核心线程,还有任务队列,那么就可以保证资源的争夺是处于一个尽量可控的状态的。

  • 线程的管理

以上就是我的学习成果,如果有什么我没有思考到的地方或是文章内存在错误,欢迎与我分享。


相关文章推荐:
多线程编程基础(一)-- 线程的使用

相关文章

  • 线程

    Java 并发编程:线程池的使用 Java 并发编程:线程池的使用java 多线程核心技术梳理 (附源码) 本文对...

  • 源码分析之ThreadPoolExecutor

    线程池在多线程编程的中可谓是个利器,使用线程池会大大提高多线程的效率。原因是使用线程池相对于new Thread有...

  • 多线程编程基础(二)-- 线程池的使用

    前言 在多线程编程基础(一)中,讲到了线程最基本的使用方法。但是在阿里的开发规范上,这是不值得推荐的。可以在ide...

  • Java:线程池Executors.newFixedThread

    摘要:Java,多线程,线程池 多线程编程和线程池概述 (1)多线程程序: 计算机可以实现多任务 ( multit...

  • Java多线程与线程池技术

    一、序言 Java多线程编程线程池被广泛使用,甚至成为了标配。 线程池本质是池化技术的应用,和连接池类似,创建连接...

  • Springboot | 线程池的学习,多线程池配置示例

    一、线程和进程,线程的生命周期二、单线程和多线程三、线程池的概念四、线程池的使用五、多线程池配置示例 一、线程和进...

  • 多进程和多线程的应用场景

    其实,使用多线程编程还是使用多进程编程,有一个简单的原则,如果能使用多线程实现的,就用多线程,不能使用多线程实现的...

  • 多线程编程

    多线程编程之Linux环境下的多线程(一)多线程编程之Linux环境下的多线程(二)多线程编程之Linux环境下的...

  • 更好的使用Java线程池ThreadPoolExecutor

    在多线程编程中创建线程池的时候,一般禁止使用Executors.newFixedThreadPool(8)方式创建...

  • 多线程 | 4.线程池

    Java并发编程:线程池的使用 线程池基础 请求队列 线程池维护一定数量的线程,当线程池在运行状态的线程数量达上...

网友评论

    本文标题:多线程编程基础(二)-- 线程池的使用

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