您的位置 首页 > 德语词汇

execute的?execute和submit的区别

大家好,execute的相信很多的网友都不是很明白,包括execute和submit的区别也是一样,不过没有关系,接下来就来为大家分享关于execute的和execute和submit的区别的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!

execute和submit都属于线程池的方法,execute只能提交Runnable类型的任务

execute的?execute和submit的区别

submit既能提交Runnable类型任务也能提交Callable类型任务。异常:

execute会直接抛出任务执行时的异常,可以用try、catch来捕获,和普通线程的处理方式完全一致submit会吃掉异常,可通过Future的get方法将任务执行时的异常重新抛出。返回值:

submit有返回值,所以需要返回值的时候必须使用submit

首先看看javaapi对两个方法的描述

execute()是在Executor接口中定义的,ThreadPoolExecutor继承了AbstractExecutorService抽象类,该抽象类实现了ExecutorService接口(但并没有覆盖execute方法),而ExecutorService接口继承了Executor接口。总觉:就是说ThreadPoolExecutor实现了execute()方法。然后我们来看看api文档对execute()方法是如何定义的:

executepublicvoidexecute(Runnablecommand)\n在将来某个时间执行给定任务。可以在新线程中或者在现有池线程中执行该任务。如果无法将任务提交执行,或者因为此执行程序已关闭,或者因为已达到其容量,则该任务由当前RejectedExecutionHandler处理。\n\n参数:command-要执行的任务。抛出:RejectedExecutionException-\n如果无法接收要执行的任务,则由RejectedExecutionHandler决定是否抛出\nRejectedExecutionExceptionNullPointerException-如果命令为null\n

submit方法是ExecutorService接口里面定义的,具体的实现由AbstractExecutorService进行。submit方法被重载了三次,分别对用三个不同的参数。对api摘录如下:

(1)submitpublicFuture<?>submit(Runnabletask)\n\n提交一个Runnable任务用于执行,并返回一个表示该任务的Future。该Future的get方法在成功完成时将会返回null。\n\n指定者:接口ExecutorService中的submit参数:task-要提交的任务返回:表示任务等待完成的Future\n\n---------------------------------------------------------------------------------------\n(2)submitpublicFuturesubmit(Runnabletask,Tresult)提交一个\nRunnable任务用于执行,并返回一个表示该任务的Future。该Future的get方法在成功完成时将会返回给定的结果。\n\n指定者:接口ExecutorService中的submit参数:task-要提交的任务result-返回的结果\n返回:表示任务等待完成的Future\n-----------------------------------------------------------------------------------------\n(3)submitpublicFuturesubmit(Callabletask)\n提交一个返回值的任务用于执行,返回一个表示任务的未决结果的Future。该Future的get\n方法在成功完成时将会返回该任务的结果。如果想立即阻塞任务的等待,则可以使用result=\nexecute.submit(aCallable).get();形式的构造。\n-----------------------------------------------------------------------------------------\n注:Executors类包括了一组方法,可以转换某些其他常见的类似于闭包的对象,例如,将PrivilegedAction转换为Callable形式,这样就可以提交它们了。\n\n指定者:接口ExecutorService中的submit参数task-要提交的任务返回:表示任务等待完成的Future\n

API中的(2)(3)就是说execute不支持Future那一套来接收多线程的执行结果,而submit可以,但是(1)中说该Future的get方法在成功完成时将会返回null,那要是返回null,和用execute有什么区别?我直接使用execute就好

然后继续看源码,点击进入了AbstractExecutorService抽象类源代码,发现源码如下:

publicFuture<?>submit(Runnabletask){\nif(task==null)thrownewNullPointerException();\nRunnableFuture<Void>ftask=newTaskFor(task,null);\nexecute(ftask);\nreturnftask;\n}\n\n\npublic<T>Future<T>submit(Runnabletask,Tresult){\nif(task==null)thrownewNullPointerException();\nRunnableFuture<T>ftask=newTaskFor(task,result);\nexecute(ftask);\nreturnftask;\n}\n\npublic<T>Future<T>submit(Callable<T>task){\nif(task==null)thrownewNullPointerException();\nRunnableFuture<T>ftask=newTaskFor(task);\nexecute(ftask);\nreturnftask;\n}\n\n

这里显示把拿到的Runnable任务又抛给了execute()方法!

此时得出结论:如果提交的任务不需要一个结果的话直接用execute()会提高性能。

文章分享结束,execute的和execute和submit的区别的答案你都知道了吗?欢迎再次光临本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023