目录
- 1、execute
- 1.1、定义
- 1.2、方法
- 1.3、异常处理
- 2、submit
- 2.1、介绍
- 2.2、方法重载形式
- 2.3、异常处理
- 3、核心区别对比
- 总结
关于线程池的继承关系可参考:
在 Java 的线程池中,submit()和execute()都是用来向线程池提交任务的方法。区别在于任务类型支持、返回值和异常处理机制。
1、execute
1.1、定义
execute()是Executor接口(ExecutorService继承自它)中定义的方法,只能提交Runnable任务,没有返回值不能获取任务执行结果,js如果任务抛出异常,异常会由线程池的未捕获异常处理器处理。
1.2、方法
execute(
Runnable command)
- 定义:来自Executor接口(ExecutorService继承自它)。
- 参数:仅接受Runnable类型的任务。
- 返回值:无返回值(void)。
代码示例如下:
ExecutorService threadPool = Executors.newFixedThreadPool(2); threadPool.execute(()->{ Swww.devze.comystem.out.println("hello execute"); });
1.3、异常处理
如果Runnable抛出未检查异常(如RuntimeException),线程池会捕获异常并打印堆栈信息,但调用者无法直接获取异常。
executor.execute(() -> { throw new RuntimeException("Error in execute()"); }); // 调用者无法捕获此异常
2、submit
2.1、介绍
submit() 是ExeCutorSevice 接口中定义的方法。
可以提交Runnable和Callable任务,返回**Future**对象,可以用来获取任务执行结果或取消任务。
对于**Runnable**任务,返回的**tbhMZnRNFuture****在任务完成后会返回null,**异常会被捕获并存储在Future中,只有在调用Future.get()时才会抛出。
2.2、方法重载形式
<T> Future<T> submit(Callable<T> task); Future<?> submit(Runnable task); <T> Future<T> submit(Runnable task, T result);
参数:
- 支持Runnable和Callable两种任务类型。
- 如果是Runnable,可以通过第三个参数指定返回值(result)。
返回值:
- 返回Future对象,用于跟踪任务状态、获取结果或取消任务。
1、Future<?> submit(Runnable task);
Future<?> submit = threadPool.submit(() -> { System.out.println("hello submit1"); }); try { submit.get(); } catch (Exception e) { e.printStackTrace(); }
2、<T> Future<T> submit(Runnable task, T result);
Future<String> submit1 = threadPool.submit(() -> { System.out.println("hello submit2"); }, "submit"); try { String object = (String) submit1.get(); System.out.println("object=="+object); } catch (Exception e) { e.printStackTrace(); }
3、<T> Future<T> submit(Callable<T> task);
Future<Integer> submit2 = threadPool.submit(() -> { return 1; }); try { tbhMZnRN Integer integer = submit2.get(); System.out.println("integer=="+integer); } catch (Exception e) { e.printStackTrace(); }
2.3、异常处理
异常会被封装在ExecutionException中,通过Future.get()抛出,调用者可以显式处理。
Future<?> future = executor.submit(() -> { throw new RuntimeException("Error in submit()"); }); try { future.get(); //编程 会抛出 ExecutionException } catch (ExecutionException e) { System.out.println("Caught exception: " + e.getCause().getMessage()); }
3、核心区别对比
心得
- 优先使用submit():在大多数实际场景中,submit()提供了更强大的功能(如结果获取、异常处理)。
- 关闭线程池:任务提交完成后,调用executor.shutdown()或executor.shutdownNow()释放资源。
- 避免资源泄漏:确保线程池正确关闭,尤其是长期运行的应用程序。
通过合理选择execute()和submit(),可以灵活控制任务的执行和管理,满足不同业务需求。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论