java执行器
Executor
执行已提交的 Runnable 任务对象。此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节、调度等)分离开来的方法。Executor 接口并没有严格地要求执行是异步的。
public interface Executor {
void execute(Runnable command);
}
ExecutorService
ExecutorService是Executor的子类,扩展了更多的方法。提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以关闭 ExecutorService,这将导致其拒绝新任务。
提供两个方法来关闭 ExecutorService。 shutdown()方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务的启动并试图停止当前正在执行的任务。
关闭任务执行,已经提交的会等执行完再关闭*/
void shutdown(); /**
* 立即关闭任务执行*/
List<Runnable> shutdownNow(); /**
是否被shutdown*/
boolean isShutdown(); /**
在shutdown方法被调用后,如果所有任务结束则返回true*/
boolean isTerminated(); /**
在shutdown方法被调用后,阻塞直到所有任务完成。可以设置timeout时间,如果超时,返回false。
*/
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
提供三个方法来跟踪一个异步任务执行。
/**
* 执行一个callable,返回一个future*/
<T> Future<T> submit(Callable<T> task); /**
* 执行一个callable,返回一个future,通过future的get方法获得result值。*/
<T> Future<T> submit(Runnable task, T result); /**
*执行一个runnable,返回一个future*/
Future<?> submit(Runnable task);
提供四个方法来执行批量任务
/**
执行多个callable,返回多个future,该方法会一直阻塞到所有任务完成*/
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
throws InterruptedException; /**
执行多个callable,返回多个future,该方法会一直阻塞到所有任务完成,如果timeout,抛出异常,取消尚未执行的任务*/
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException; /**
* 任意一个callable执行成功后返回,取消尚未执行完的任务*/
<T> T invokeAny(Collection<? extends Callable<T>> tasks)
throws InterruptedException, ExecutionException; /**
* 任意一个callable执行成功后返回,取消尚未执行的任务,如果timeout,抛出异常,取消尚未执行的任务*/
<T> T invokeAny(Collection<? extends Callable<T>> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
ThreadPoolExecutor
ThreadPoolExecutor是ExecutorService的一个实现类,它使用池线程执行每个提交的任务。
ThreadPoolExecutor内部用一个变量保存了两个内容:所有有效线程的数量各个线程的状态(runState)。
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
ThreadPoolExecutor内部有一个队列,当提交任务时,首先会提交到队列中,执行任务时会从队列中获取任务。
ThreadPoolExecutor将根据corePoolSize(参见 getCorePoolSize())和 maximumPoolSize(参见 getMaximumPoolSize()) 设置的边界自动调整池大小。当新任务在方法 execute(java.lang.Runnable) 中提交时,如果运行的线程少于 corePoolSize, 则创建新线程来处理请求,即使有线程是空闲的。 如果运行的线程多于 corePoolSize 而少于 maximumPoolSize,则仅当队列满时才创建新线程。 如果设置的 corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池。 如果将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),则允许池适应任意数量的并发任务。
java执行器的更多相关文章
- JAVA学习笔记及知识积累
为什么说Java具有跨平台特性? 我们知道计算机只认识1,0两种电平的信号,所有信息或者计算指令最终都编码成16进制的机器码,这些机器码作为程序保存于计算机的内存中,由CPU去单个取指令执行直到程序执 ...
- Java IO_003.Reader与Writer--字符流以及编码对数据的操作(读取与写入)
Java IO之Reader与Writer对象常用操作(包含了编码问题的处理) 涉及到文件(非文件夹)内容的操作,如果是纯文本的情况下,除了要用到File(见之前文章),另外就必须用到字符输入流或字符 ...
- (私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例)
(私人收藏)[开发必备]最全Java离线快速查找手册(可查询可学习,带实例) https://pan.baidu.com/s/1L54VuFwCdKVnQGVc8vD1TQnwmj java手册 Ja ...
- HowToDoInJava Java 教程·翻译完成
原文:HowToDoInJava 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 学习资源 目录 核心 Java 教程 什 ...
- 分布式任务调度平台XXL-JOB
<分布式任务调度平台XXL-JOB> 一.简介 1.1 概述 XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速.学习简单.轻量级.易扩展.现已开放源代码并 ...
- windows的一些好用命令-自己总结:
在win+R运行框中: cmd:进入命令行界面 msconfig:可以查看“系统配置” msinfo32:查看系统信息 services.msc打开"服务&q ...
- JVM调优参数、方法、工具以及案例总结
这种文章挺难写的,一是JVM参数巨多,二是内容枯燥乏味,但是想理解JVM调优又是没法避开的环节,本文主要用来总结梳理便于以后翻阅,主要围绕四个大的方面展开,分别是JVM调优参数.JVM调优方法(流程) ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 【翻译十九】-java之执行器
Executors In all of the previous examples, there's a close connection between the task being done by ...
随机推荐
- 真正从底层理解 Synchronized 实现原理
实现synchronized的基础有两个:Java 对象头和 Monitor. 在虚拟机规范中定义了对象在内存中的布局,主要由以下 3 部分组成: 对象头 实例数据 对齐填充 而synchronize ...
- try easy pytest 1tep介绍
『 tep is a testing tool to help you write pytest more easily. Try Easy Pytest! 』 tep前身 tep的前身是接口自动化测 ...
- python读取数据文件:pandas包详解
本文转载自https://blog.csdn.net/brucewong0516/article/details/79092579 pandas包是一个高效的文件读取工具,适用于txt,excel,等 ...
- FastStone Capture注册破解码
原文链接:https://blog.csdn.net/lxq_9532/article/details/82893170 faststone-capture下载链接: https://en.softo ...
- 区块链入门到实战(32)之Solidity – 代码注释
Solidity 支持c风格和c++风格的注释. //之后到行尾的文本,都被看作注释,编译器忽略此内容 /* 与 */ 之间的文本被看作注释, 编译器忽略此内容 示例 注释示例. function g ...
- influxDB初步学习
influxdb的安装等操作在我的文章. 首先得装influxdb,其次操作如下. application.properties spring.datasource.test1.jdbc-url=jd ...
- .NET Core3.1 Dotnetty实战第一章
一.概要 本系列文章主要讲述由微软Azure团队研发的.net的版本的netty,Dotnetty.所有的开发都将基于.net core 3.1版本进行开发. Dotnetty是什么,原本Netty是 ...
- .Net自动更新程序GeneralUpdate,适用于wpf,winfrom,控制台应用
什么是GeneralUpdate: GeneralUpdate是基于.net framwork4.5.2开发的一款(c/s应用)自动升级程序. 第一个版本叫Autoupdate(原博客: WPF自动更 ...
- 如何扩展单个Prometheus实现近万Kubernetes集群监控?
引言 TKE团队负责公有云,私有云场景下近万个集群,数百万核节点的运维管理工作.为了监控规模如此庞大的集群联邦,TKE团队在原生Prometheus的基础上进行了大量探索与改进,研发出一套可扩展,高可 ...
- Python中的协程,为什么说它的底层是生成器?
我们曾经在golang关于goroutine的文章当中简单介绍过 协程 的概念,我们再来简单review一下.协程又称为是微线程,英文名是Coroutine.它和线程一样可以调度,但是不同的是线程的启 ...