Java 中几种常用的线程池

概述:

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

  • 继承Thread方式

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

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

Java线程池

Java提供了四种线程池

newCachedThreadPool :

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

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

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

newFixedThreadPool :

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

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);

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

newScheduledThreadPool :

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

ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

使用实例:

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);

newSingleThreadExecutor :

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

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();

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

java.util.concurrent

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

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

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

ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {}

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

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

Trinea:Java(Android)线程池

Java多线程:ThreadPoolExecutor详解

并发编程网 - ifeve.com

线程池ThreadPoolExecutor介绍

你可能感兴趣的:(Java基础)