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 的类型
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();
ExecutorService fixedThreadPool = Executors.newCachedThreadPool(); Future<String> submit = fixedThreadPool.submit(() -> { System.out.println("Task executed by " + Thread.currentThread().getName()); return Thread.currentThread().getName(); }); fixedThreadPool.shutdown();
ExecutorService fixedThreadPool = Executors.newSingleThreadExecutor(); Future<String> submit = fixedThreadPool.submit(() -> { System.out.println("Task executed by " + Thread.currentThread().getName()); return Thread.currentThread().getName(); }); fixedThreadPool.shutdown()
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
关于 Callable
关于未来
快乐编码和学习!!!
如有任何问题请留言。
以上是Java中Executor服务概述的详细内容。更多信息请关注PHP中文网其他相关文章!