Java 中几种常用的线程池

Posted SpringMVCMaven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 中几种常用的线程池相关的知识,希望对你有一定的参考价值。

Java 中几种常用的线程池

 

转载 : https://www.cnblogs.com/sachen/p/7401959.html

原创 2016年04月14日 23:29:01

概述:

在java内置API中操作线程所用到的类为Thread。创建线程一般有两种方式,

  • 继承Thread方式

  • 实现Runnable方式,并以runnable作为target创建Thread

android中的耗时任务一般都需要另开线程来执行,常常需要用线程池来管理这些线程,实现控制线程数,重用,控制执行和取消等功能。

Java线程池

Java提供了四种线程池

newCachedThreadPool :

可缓存线程池,若线程池长度超过处理需要,则回收空线程,否则创建新线程,线程规模可无限大。

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
  • 1

当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。

newFixedThreadPool :

定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
  • 1

定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()。

newScheduledThreadPool :

定长线程池,支持定时及周期性任务执行,类似Timer。

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
  • 1

使用实例:

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
//表示延迟1秒后每3秒执行一次。
scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
        System.out.println("delay 1 seconds, and excute every 3 seconds");
    }
}, 1, 3, TimeUnit.SECONDS);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

newSingleThreadExecutor :

单线程 的线程池,支持FIFO, LIFO, 优先级策略。

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
  • 1

通过观察源码,其中四种线程的创建都是创建一个ThreadPoolExecutor。其中ThreadPoolExecutor是ExecutorService接口的实现类。

java.util.concurrent

此包是java的并发编程包,其下定义了三个Executor接口

并发类图

Executor:一个运行新任务的简单接口。 
ExecutorService:扩展了Executor接口。添加了一些用来管理执行器生命周期和任务生命周期的方法。 
ScheduledExecutorService:扩展了ExecutorService。支持Future和定期执行任务。

实现类包括:ScheduledThreadPoolExecutor、ThreadPoolExecutor。 
java中提供的四种线程池,除了ScheduledThreadPool使用的是ScheduledThreadPoolExecutor,其他均为ThreadPoolExecutor。

ThreadPoolExecutor

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参数说明 
corePoolSize :线程池的核心线程数。 
maximumPoolSize :线程池所能容纳的最大线程数。 
keepAliveTime :非核心线程闲置时的超时时长。超过该时长,非核心线程就会被回收。 
unit :keepAliveTime的时间单位。 
workQueue :线程池中的任务队列。 
threadFactory:线程工厂,默认值DefaultThreadFactory。 
handler : 饱和策略,当线程池中的数量大于maximumPoolSize,对拒绝任务的处理策略,默认值ThreadPoolExecutor.AbortPolicy()。

参考: 
Java并发教程(Oracle官方资料)

Trinea:Java(Android)线程池

Java多线程:ThreadPoolExecutor详解

并发编程网 - ifeve.com

线程池ThreadPoolExecutor介绍

以上是关于Java 中几种常用的线程池的主要内容,如果未能解决你的问题,请参考以下文章

java 中几种常用数据结构

Java中几种常量池的区分

Java常用的几种线程池

多线程——Java线程池原理深入

java多线程学习之——多线程中几种释放锁和不释放锁的操作

java开发过程中几种常用算法