一、submit方法的概述
submit是ExecutorService接口提供的一个提交任务的方法,用于提交一个Runnable或Callable任务到线程池中执行。该方法会返回一个Future对象,Future对象可以用来获取任务执行结果或取消任务执行。
二、submit方法的重载
submit方法提供了多个重载,用于支持不同类型的任务。下面是submit方法重载的几种形式:
// 提交一个Runnable任务,并返回一个Future对象 Future submit(Runnable task); // 提交一个Callable任务,并返回一个Future对象 Future submit(Callable task); // 提交一个Runnable任务和一个结果result,返回一个Future对象 Future submit(Runnable task, T result);
三、submit方法的执行过程
当我们提交一个任务后,submit方法首先会检查线程池是否有空闲线程可用来执行该任务。如果有,submit方法会把任务直接提交给一个空闲线程执行,并返回一个表示该任务执行状态的Future对象;如果没有,submit方法会把该任务添加到线程池的等待队列中等待执行,并返回一个表示该任务排队状态的Future对象。当线程池的某个线程空闲时,会从等待队列中取出头部的任务并交给该线程执行。
四、submit方法与execute方法的区别
ExecutorService提供了两个提交任务的方法:submit和execute。两者最大的区别在于submit方法可以返回一个表示任务执行结果的Future对象,而execute方法不返回任何结果。
// 提交一个Runnable任务,execute方法不返回结果 void execute(Runnable command);
由于submit方法可以返回执行结果,因此它的使用范围更广,而execute方法主要用于提交不需要返回结果的任务。
五、submit方法的异常处理
当我们提交一个Callable任务时,任务可能会抛出异常。如果我们没有对异常进行捕获处理,那么任务所在的线程将会退出,从而导致该线程无法执行其他任务。为了避免这种情况的发生,我们可以通过捕获Future.get方法抛出的ExecutionException异常来获取任务执行过程中抛出的异常,并进行处理。
// 提交Callable任务,并进行异常处理 Future future = executorService.submit(new Callable() { @Override public String call() throws Exception { // 抛出异常 throw new RuntimeException("Callable抛出异常"); } }); try { // 获取任务执行结果 String result = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { Throwable cause = e.getCause(); if (cause instanceof RuntimeException) { System.out.println("Catch RuntimeException: " + cause.getMessage()); } }
六、submit方法的使用示例
下面是一个使用submit方法的示例,该示例提交了10个任务到线程池中执行,并对任务执行过程中的异常进行了捕获处理。
public class SubmitExample { public static void main(String[] args) { // 创建一个线程池 ExecutorService executorService = Executors.newFixedThreadPool(5); // 提交10个任务到线程池中执行 List<Future> futures = new ArrayList(); for (int i = 1; i <= 10; i++) { final int taskId = i; Future future = executorService.submit(new Callable() { @Override public String call() throws Exception { // 抛出异常 if (taskId == 5) { throw new RuntimeException("Callable任务抛出异常"); } return "Task " + taskId + " executed."; } }); futures.add(future); } // 获取任务执行结果并输出 for (Future future : futures) { try { String result = future.get(); System.out.println(result); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { Throwable cause = e.getCause(); if (cause instanceof RuntimeException) { System.out.println("Catch RuntimeException: " + cause.getMessage()); } } } // 关闭线程池 executorService.shutdown(); } }
原创文章,作者:IRBS,如若转载,请注明出处:https://www.506064.com/n/131928.html