ExecutorService 线程池

简介: 1.ExecutorService java.util.concurrent.ExecutorService 接口。用来设置线程池并执行多线程任务。它有以下几个方法。 Future<?> java.util.concurrent.ExecutorService.submit(Runnable task) 提交任务并执行,返回代表这个任务的future对象。在任务成功执行

1.ExecutorService

java.util.concurrent.ExecutorService

接口。用来设置线程池并执行多线程任务。它有以下几个方法。

Future<?> java.util.concurrent.ExecutorService.submit(Runnable task)

提交任务并执行,返回代表这个任务的future对象。在任务成功执行完毕之前,future.get()会返回null。

<E> Future<E> java.util.concurrent.ExecutorService.submit(Callable<E> task)
提交一个有返回值的任务并运行。在任务成功执行完毕之前,future.get()会阻塞。

void java.util.concurrent.ExecutorService.shutdown()
启动一个有序的关闭,关闭那些先前提交过的已执行完毕的任务。此时ExecutorService不再接受新的任务。

List<Runnable> java.util.concurrent.ExecutorService.shutdownNow()
尝试终止正在执行的任务,终止等待执行的线程,返回等待执行的线程列表。

boolean java.util.concurrent.ExecutorService.isTerminated()

进程池已经被shutdown且所有任务均已完成时,返回true。

2.Executors

java.util.concurrent.Executors

工厂类,可以通过静态方法获得实现ExecutorService接口的对象。

主要有下面几种,见表2-1.

表2-1 常见的ExecutorService实现类


2.1 ThreadPoolExecutor

ExecutorService java.util.concurrent.Executors. newCachedThreadPool()
返回的是java.util.concurrent.ThreadPoolExecutor对象。

java.util.concurrent.ThreadPoolExecutor

类。用于接收提交的任务,放到线程池中运行。

java.util.concurrent.ThreadPoolExecutor.ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

构造函数。

corePoolSize:最小线程数。一般会取Runtime.getRuntime().availableProcessors()。
maximumPoolSize:任务变多时,最大线程数。一般会取corePoolSize*20.
keepAliveTime:多开的线程用完后,等待一定时间再被回收。
unit:时间单位。
workQueue:当线程池已满,新任务不能立即执行的时候,就会放进此等待队列。
threadFactory:创建线程的工厂。
java.util.concurrent.ThreadPoolExecutor. ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue)

ThreadPoolExecutor构造函数的重载。

 long java.util.concurrent.ThreadPoolExecutor.getCompletedTaskCount()
返回执行完毕的任务数,是近似值。
 long java.util.concurrent.ThreadPoolExecutor.getTaskCount()
返回加入执行计划的所有任务总数,是近似值。
 int java.util.concurrent.ThreadPoolExecutor.getActiveCount()
 返回正在执行任务的的活动状态的线程数,是近似值。

java.util.concurrent. ThreadFactory
接口,它只有下面一个方法:
Thread java.util.concurrent.ThreadFactory. newThread(Runnable r)
生成Thread并返回。

2.2 ScheduledThreadPoolExecutor

java.util.concurrent.ScheduledThreadPoolExecutor.ScheduledThreadPoolExecutor(int corePoolSize)
构造函数,创建“计划线程池执行器”。此类为ExecutorService的实现类。

ScheduledFuture<?> java.util.concurrent.ScheduledExecutorService.scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
开辟新线程执行任务。延迟initialDelay时间后开始执行command,并且按照period时间周期性重复调用,并且保证在上次运行完后才会执行下一次,周期时间不包括command运行时间。

ScheduledFuture<?> java.util.concurrent.ScheduledExecutorService.scheduleAtFixedRate(Runnable command, long initialDelay, long delay, TimeUnit unit)

延迟initialDelay时间后开始执行command,并且按照period时间周期性重复调用。周期时间包括command运行时间,如果周期时间比command运行时间短,则command运行完毕后,立刻重复运行。


3.线程异常

任务中抛出未被捕获的异常 不会造成线程池的线程消失。线程池对此做了保护机制。查看jdk源码可以找到这部分代码。

4.任务过多

java.util.concurrent.RejectedExecutionHandler
接口,它只有下面一个方法:
void rejectedExecution(Runnable r, ThreadPoolExecutor executor)
当提交的任务不能被ThreadPoolExecutor执行时(如等待队列已满),调用此函数。
java.util.concurrent.ThreadPoolExecutor.AbortPolicy
RejectedExecutionHandler的实现类。它会抛出异常RejectedExecutionException。
java.util.concurrent.ThreadPoolExecutor.DiscardPolicy
RejectedExecutionHandler的实现类。它的函数体为空,即什么也不做。

目录
相关文章
|
6月前
|
Java
ExecutorService、Callable、Future实现有返回结果的多线程原理解析
ExecutorService、Callable、Future实现有返回结果的多线程原理解析
37 0
|
存储 安全
使用ExecutorService来停止线程服务
使用ExecutorService来停止线程服务
|
Java 缓存 网络协议
EXECUTORSERVICE线程池讲解
ExecutorService 建立多线程的步骤: 1。定义线程类 class Handler implements Runnable{ } 2。建立ExecutorService线程池 ExecutorService executorService = Executors.newCachedThreadPool(); 或者 int
1422 0
|
Java 缓存 网络协议
|
2天前
|
存储 安全 Java
【探索Linux】P.21(多线程 | 线程同步 | 条件变量 | 线程安全)
【探索Linux】P.21(多线程 | 线程同步 | 条件变量 | 线程安全)
9 0
|
2天前
|
算法 安全 Linux
【探索Linux】P.20(多线程 | 线程互斥 | 互斥锁 | 死锁 | 资源饥饿)
【探索Linux】P.20(多线程 | 线程互斥 | 互斥锁 | 死锁 | 资源饥饿)
9 0
|
2天前
|
存储 安全 Linux
【探索Linux】P.19(多线程 | 线程的概念 | 线程控制 | 分离线程)
【探索Linux】P.19(多线程 | 线程的概念 | 线程控制 | 分离线程)
6 0
|
10天前
|
监控 安全 Java
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
|
10天前
|
缓存 安全 Java
多线程--深入探究多线程的重点,难点以及常考点线程安全问题
多线程--深入探究多线程的重点,难点以及常考点线程安全问题
|
10天前
|
数据采集 安全 Java
Python的多线程,守护线程,线程安全
Python的多线程,守护线程,线程安全