Executor 和 ExecutorService API 是管理和控制线程执行的重要工具。它们是 java.util.concurrent 包的一部分。它们通过抽象线程创建、管理和同步的复杂性来简化并发编程的过程。
Executors 是 java.util.concurrent 包中的实用工具类,提供用于创建和管理不同类型的 ExecutorService 实例的工厂方法。它简化了创建线程池的过程,让我们可以轻松地创建和管理不同配置的执行器实例。
Executor API 它是从 Java 1.5 开始提供的接口。它提供了execute(Runnable command)方法。 这是基本接口,ExecutorService 扩展了该接口。给定的命令将在将来由新线程或线程池中的线程或同一线程执行,并且不会返回 void。
ExecutorService API 它是从 Java 1.5 开始提供的接口。它提供了多种方法来控制并发编程中任务的执行。它支持可运行和可调用任务。它返回任务状态的 Future。以下是最常用的方法。
submit() 接受 Callable 或 Runnable 任务并返回 Future 类型结果。
invokeAny() 接受一组要运行的任务,并返回任何一个任务成功执行的结果。
invokeAll() 接受要运行的任务集合,并以 Future 对象类型列表的形式返回所有任务的结果。
shutdown() 不会立即停止执行器服务,但不接受新任务。一旦所有当前正在运行的任务完成,它就会关闭执行器服务。
shutdownNow() 会尝试立即停止执行器服务,但不保证所有正在运行的任务会同时停止。
awaitTermination(long timeout, TimeUnit unit) 阻塞/等待,直到所有任务完成或发生超时或当前线程被中断,以先发生者为准。当前线程将被阻塞。
ExecutorService 的类型
- FixThreadPool 它创建具有指定线程数的固定大小线程池。提交的任务是并发执行的。如果没有任务,线程将处于空闲状态,直到任务到达。如果线程繁忙,任务将被添加到队列中。
ExecutorService fixedThreadPool = Executors.newScheduledThreadPool(5); Future<string> submit = fixedThreadPool.submit(() -> { System.out.println("Task executed by " + Thread.currentThread().getName()); return Thread.currentThread().getName(); }); fixedThreadPool.shutdown(); </string>
- CachedThreadPool 创建线程池并根据工作负载自动调整池中所需的线程数。如果线程空闲超过60秒,就会被终止。这对于动态负载非常有效。由于线程将在空闲超时后被杀死,因此这里可以更好地利用资源。
ExecutorService fixedThreadPool = Executors.newCachedThreadPool(); Future<string> submit = fixedThreadPool.submit(() -> { System.out.println("Task executed by " + Thread.currentThread().getName()); return Thread.currentThread().getName(); }); fixedThreadPool.shutdown(); </string>
- SingleThreadExecutor 创建单线程,任务按顺序执行。这里没有并行处理。
ExecutorService fixedThreadPool = Executors.newSingleThreadExecutor(); Future<string> submit = fixedThreadPool.submit(() -> { System.out.println("Task executed by " + Thread.currentThread().getName()); return Thread.currentThread().getName(); }); fixedThreadPool.shutdown() </string>
- ScheduledThreadPool/ScheduledExecutor 它创建一个线程或 trhead 池,能够定期运行任务或在一定延迟后运行。
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); // Single-threaded scheduler ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5); // Multi-threaded scheduler
scheduler.schedule(task, 10, TimeUnit.SECONDS); // Schedule task to run after 10 seconds. scheduler.scheduleAtFixedRate(task, 5, 10, TimeUnit.SECONDS); //It schedules a task to run every 10 seconds with an initial delay of 5 seconds. scheduler.scheduleWithFixedDelay(task, 5, 10, TimeUnit.SECONDS); //It schedules a task to run with a fixed delay of 10 seconds between the end of one execution and the start of the next, with an initial delay of 5 seconds. scheduler.schedule(() -> scheduler.shutdown(), 20, TimeUnit.SECONDS); //It schedules a shutdown of the scheduler after 20 seconds to stop the example.
向 ExecutorService 提交任务
可以使用execute() 和submit() 方法将任务提交给ExecutorService。 execute()方法用于Runnable任务,而submit()可以处理Runnable和Callable任务。”
executor.execute(new RunnableTask()); //fire-and-forgot executor.submit(new CallableTask()); //returns the status of task
关闭 ExecutorService
关闭 ExecutorService 以释放资源非常重要。您可以使用 shutdown() 和 shutdownNow() 方法来执行此操作。
executor.shutdown(); // Initiates an orderly shutdown" executor.shutdownNow(); // Attempts to stop all actively executing tasks. executor.awaitTermination(long timeout, TimeUnit unit); //blocks the thread until all tasks are completed or timeout occurs or current thread is interrupted, whichever happens first. Returns `true `is tasks completed, otherwise `false`.
推荐的关闭方法
executor.shutdown(); try { // Wait for tasks to complete or timeout if (!executor.awaitTermination(120, TimeUnit.SECONDS)) { // If the timeout occurs, force shutdown executor.shutdownNow(); } } catch (InterruptedException ex) { executor.shutdownNow(); Thread.currentThread().interrupt(); }
关于 Runnable
- Runnable 是一个接口,代表一个可以通过线程运行的任务。
- 我们可以使用Threads或Executor服务来运行Runnable任务。
- Runnable 有 run() 方法,并且不返回任何数据。
- 我们不能抛出已检查的异常。
关于 Callable
- 1.5中引入
- 它有 call() 方法并返回类型 V。
- 它包含 throws Exception 的意思,我们可以抛出检查异常。
关于未来
- 它代表任何任务的未来结果。
- 请求处理完成后,结果最终会在Future中出现。
- boolean isDone() 返回请求处理的状态。如果完成则为 true,否则为 false。
- boolean cancel(boolean mayInterruptIfRunning) 取消提交的任务。如果我们将 mayInterruptIfRunning 传递为 false,那么它不会取消已经启动的任务。
- boolean isCancelled() 返回任务是否取消。
- V get() 返回任务结果。如果任务未完成,则阻塞线程。
- V get(long timeout, TimeUnit unit) 如有必要,最多等待给定时间以完成计算,然后检索其结果。如果计算未完成,将在指定时间后抛出 TimeoutException。
快乐编码和学习!!!
如有任何问题请留言。
以上是Java中Executor服务概述的详细内容。更多信息请关注PHP中文网其他相关文章!

类加载器通过统一的类文件格式、动态加载、双亲委派模型和平台无关的字节码,确保Java程序在不同平台上的一致性和兼容性,实现平台独立性。

Java编译器生成的代码是平台无关的,但最终执行的代码是平台特定的。1.Java源代码编译成平台无关的字节码。2.JVM将字节码转换为特定平台的机器码,确保跨平台运行但性能可能不同。

多线程在现代编程中重要,因为它能提高程序的响应性和资源利用率,并处理复杂的并发任务。JVM通过线程映射、调度机制和同步锁机制,在不同操作系统上确保多线程的一致性和高效性。

Java的平台独立性是指编写的代码可以在任何安装了JVM的平台上运行,无需修改。1)Java源代码编译成字节码,2)字节码由JVM解释执行,3)JVM提供内存管理和垃圾回收功能,确保程序在不同操作系统上运行。

Javaapplicationscanindeedencounterplatform-specificissuesdespitetheJVM'sabstraction.Reasonsinclude:1)Nativecodeandlibraries,2)Operatingsystemdifferences,3)JVMimplementationvariations,and4)Hardwaredependencies.Tomitigatethese,developersshould:1)Conduc

云计算显着提升了Java的平台独立性。 1)Java代码编译为字节码,由JVM在不同操作系统上执行,确保跨平台运行。 2)使用Docker和Kubernetes部署Java应用,提高可移植性和可扩展性。

Java'splatformindependenceallowsdeveloperstowritecodeonceandrunitonanydeviceorOSwithaJVM.Thisisachievedthroughcompilingtobytecode,whichtheJVMinterpretsorcompilesatruntime.ThisfeaturehassignificantlyboostedJava'sadoptionduetocross-platformdeployment,s

容器化技术如Docker增强而非替代Java的平台独立性。1)确保跨环境的一致性,2)管理依赖性,包括特定JVM版本,3)简化部署过程,使Java应用更具适应性和易管理性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

WebStorm Mac版
好用的JavaScript开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

SublimeText3 Linux新版
SublimeText3 Linux最新版