一、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
微信扫一扫
支付宝扫一扫