首页 >Java >java教程 >Java中Executor服务概述

Java中Executor服务概述

Linda Hamilton
Linda Hamilton原创
2025-01-05 06:44:44904浏览

Overview of Executor Service in Java

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();
  • 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();
  • 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()
  • 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn