当前位置:首页 > 后端开发 > 正文

java submit怎么使用

Java中, submit()方法用于向线程池提交任务,并返回一个 Future对象以便跟踪任务状态或获取结果,使用步骤如下:,1. 创建线程池(如 ExecutorService executor = Executors.newFixedThreadPool(2);),2. 定义任务( Runnable或 Callable),3. 调用 submit()提交任务(如 Future future = executor.submit(task);),4. 通过 Future获取结果或检查状态(如 future.get()),5. 关闭线程池(`executor.shutdown

Java中,submit()方法是ExecutorService接口中的一个方法,用于提交一个可执行的任务,并返回一个表示该任务的Future对象,这使得调用者可以以后检查任务是否完成,甚至获取任务的结果,下面将详细介绍submit()方法的使用。

基本用法

提交Runnable任务

当使用submit()方法提交一个Runnable任务时,由于Runnable任务没有返回值,因此submit()方法会返回一个Future<?>对象,这个Future对象可以用来检查任务的状态(如是否完成)或取消任务。

ExecutorService executor = Executors.newCachedThreadPool(); Runnable task = () -> { System.out.println("Task is running"); }; Future<?> future = executor.submit(task); // 检查任务是否完成 boolean isDone = future.isDone(); System.out.println("Task is done: " + isDone); // 关闭线程池 executor.shutdown();

提交Callable任务

当使用submit()方法提交一个Callable任务时,由于Callable任务有返回值,因此submit()方法会返回一个Future<T>对象,其中T是Callable任务的返回类型,这个Future对象不仅可以用来检查任务的状态,还可以用来获取任务的结果。

异常处理

当使用submit()方法提交任务时,如果任务在执行过程中抛出未捕获的异常,这个异常不会直接抛出,而是被封装在Future对象中,只有当调用Future对象的get()方法时,才会以ExecutionException的形式抛出,其getCause()方法可获取实际的异常。

ExecutorService executor = Executors.newCachedThreadPool(); Callable<Integer> task = () -> { System.out.println("Task is running"); int result = 10 / 0; // 故意制造一个异常 return result; }; Future<Integer> future = executor.submit(task); try { // 获取任务结果(会抛出ExecutionException) Integer result = future.get(); System.out.println("Task result: " + result); } catch (InterruptedException | ExecutionException e) { // 处理异常 System.out.println("Task threw an exception: " + e.getCause()); } // 关闭线程池 executor.shutdown();

取消任务

Future对象还提供了cancel()方法,可以用来取消任务,如果任务已经开始执行,则cancel()方法会中断任务;如果任务还没有开始执行,则cancel()方法会阻止任务开始执行。

ExecutorService executor = Executors.newCachedThreadPool(); Runnable task = () -> { try { Thread.sleep(5000); // 模拟长时间运行的任务 System.out.println("Task is running"); } catch (InterruptedException e) { System.out.println("Task was interrupted"); } }; Future<?> future = executor.submit(task); // 尝试取消任务 boolean isCancelled = future.cancel(true); System.out.println("Task cancelled: " + isCancelled); // 关闭线程池 executor.shutdown();

等待任务完成

除了使用Future对象的get()方法来等待任务完成外,还可以使用awaitTermination()方法来等待所有任务完成,这个方法会阻塞当前线程,直到所有任务完成或超时。

与execute()方法的区别

submit()方法和execute()方法都是向线程池提交任务的方法,但它们有一些关键的区别:

特性 submit()方法 execute()方法
返回值 返回一个Future对象,表示任务的状态和结果 无返回值
任务类型 可以接受Runnable和Callable任务 只能接受Runnable任务
异常处理 异常被封装在Future对象中,通过get()方法抛出 异常直接抛给线程池中的工作线程
任务取消 可以通过Future对象的cancel()方法取消任务 不支持任务取消
任务状态检查 可以通过Future对象的isDone()等方法检查任务状态 不支持任务状态检查
任务结果获取 可以通过Future对象的get()方法获取任务结果 不支持任务结果获取

使用场景

submit()方法通常用于以下场景:

  • 需要检查任务状态或获取任务结果:当需要知道任务是否完成或获取任务的结果时,应该使用submit()方法。
  • 需要处理可能被拒绝的任务:当线程池已满或关闭时,submit()方法会抛出RejectedExecutionException,这允许你更好地处理这些情况。
  • 需要跟踪任务进度或取消任务:通过Future对象,你可以跟踪任务的进度或取消正在执行的任务。

示例代码归纳

下面是一个完整的示例代码,展示了如何使用submit()方法提交不同类型的任务,并处理任务的结果和异常。

import java.util.concurrent.; public class SubmitExample { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); // 提交Runnable任务 Runnable runnableTask = () -> { System.out.println("Runnable task is running"); }; Future<?> runnableFuture = executor.submit(runnableTask); // 提交Callable任务 Callable<String> callableTask = () -> { System.out.println("Callable task is running"); return "Callable task result"; }; Future<String> callableFuture = executor.submit(callableTask); // 处理Runnable任务的结果(无返回值) try { runnableFuture.get(); // 等待任务完成 System.out.println("Runnable task completed"); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } // 处理Callable任务的结果(有返回值) try { String result = callableFuture.get(); // 获取任务结果 System.out.println("Callable task result: " + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } // 关闭线程池 executor.shutdown(); } }

FAQs

submit()方法和execute()方法有什么区别?

答:submit()方法和execute()方法都是向线程池提交任务的方法,但它们有一些关键的区别。submit()方法会返回一个Future对象,表示任务的状态和结果,而execute()方法没有返回值。submit()方法可以接受Runnable和Callable任务,而execute()方法只能接受Runnable任务,在异常处理方面,submit()方法会将异常封装在Future对象中,而execute()方法会直接抛出异常。submit()方法允许你通过Future对象取消任务或检查任务状态,而execute()方法不支持这些功能。

如何获取submit()方法提交的任务的结果?

答:要获取submit()方法提交的任务的结果,你需要调用返回的Future对象的get()方法,这个方法会阻塞当前线程,直到任务完成并返回结果,如果任务在执行过程中抛出异常,get()方法会抛出ExecutionException,你可以通过调用getCause()方法获取实际的异常,以下是一个简单的示例:

ExecutorService executor = Executors.newCachedThreadPool(); Callable<Integer> task = () -> { return 42; // 返回任务结果 }; Future<Integer> future = executor.submit(task); try { Integer result = future.get(); // 获取任务结果 System.out.println("Task result: " + result); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); }

0