ExecutorService 线程池 (转发)

Stella981
• 阅读 679

1.ExecutorService

java.util.concurrent.ExecutorService

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

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

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

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

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

List 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实现类

ExecutorService 线程池 (转发)

2.1ThreadPoolExecutor

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 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 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的实现类。它的函数体为空,即什么也不做。

以上是ExecutorService 线程池的内容,更多 ExecutorService 线程 的内容,请您使用右上方搜索功能获取相关信息。

原文:https://www.aliyun.com/jiaocheng/800619.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java 面试知识点笔记(十三)多线程与并发
java线程池,利用Exceutors创建不同的线程池满足不同场景需求:1.newSingleThreadExecutor() 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。2.
Wesley13 Wesley13
3年前
java executor
在java.util.concurrent包中的ExecutorService的实现就是壹個线程池的实现任务的委托(TaskDelegation)壹旦线程把任务委托给ExecutorService,该线程就会继续执行与运行任务无关的其它任务。Executor框架的两级调度模型在HotSpotVM的线程模型中,Java线程
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
Java基础教程——线程池
启动新线程,需要和操作系统进行交互,成本比较高。使用线程池可以提高性能——线程池会提前创建大量的空闲线程,随时待命执行线程任务。在执行完了一个任务之后,线程会回到空闲状态,等待执行下一个任务。(这个任务,就是Runnable的run()方法,或Callable的call()方法)。Java5之前需要手动实现线程池,Java5之
Wesley13 Wesley13
3年前
Java 多线程,线程池,
1\.创建线程池的方法之三://对于每个任务,如果有空闲的线程可用,立即让他执行任务,//没有空闲的线程则创建一个线程。ExecutorServicepoolExecutors.newCachedThreadPool();//固定大小的线程池,任务数空闲线程数,得不到服务的任务
Wesley13 Wesley13
3年前
Java变成思想
Executor:线程池CatchedThreadPool:创建与所需数量相同的线程,在回收旧线程是停止创建新县城。FixedThreadPool:创建一定数量的线程,所有任务公用这些线程。SingleThreadPool:线程数量为1的FixedThreadPool,并且执行有序。如果需要得到线程返回值,要实现Callbale接口
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
京东云开发者 京东云开发者
7个月前
并发编程-ExecutorCompletionService解析
1、简单介绍我们在并发编程中,目前大部分做法都是将任务添加到线程池中,并拿到Future对象,将其添加到集合中,等所有任务都添加到线程池后,在通过遍历Future集合,调用future.get()来获取每个任务的结果,这样可以使得先添加到线程池的任务先等待