ExecutorService提交和执行、运行和调用
ExecutorService是在Java线程池中定义的接口,它在java.util.concurrent包中定义了与执行后台任务相关的方法。
因为在ExecutorService接口上有两个Java API实现,所以这两个是Java线程池的具体实现类。
threadpoolexecutorscheduledthreadpoolexecutor 1、ExecutorService的创建是通过工具类java.util.concurrent.Executors的静态方法创建的
Executors包有Executor、ExecutorService、ScheduledExecutorService、ThreadFactory和Callable类工厂和实用方法。
例如,创建一个ExecutorService实例。 ExecutorService实际上是线程池的管理工具。
executorserviceexecutorservice=executors.newcachedthreadpool (; executorserviceexecutorservice=executors.newfixedthreadpool (3; executorserviceexecutorservice=executors.newsinglethreadexecutor (; 2、创建任务的任务是实现Runnable或Callable接口的类。
//Callable接口公共接口callable v { v call () throws Exception; }//Runnable接口publicinterfacerunnable { publicabstractvoidrun (; }不同点
Runnable没有返回值; Callable可以返回执行结果,是通用的,可以与Future、FutureTask联合得到异步执行的结果
Callable接口的呼叫(方法允许抛出异常; Runnable的run ) )方法的异常只能在内部消化,不能继续向上扔
Callalble接口支持返回必须调用FutureTask.get )的执行结果。 此方法阻止主进程的持续运行,必须调用才能阻止。
3、将任务添加到线程中,执行执行execute或submit调用,即可将任务添加到线程池中。
线程池为每个任务创建一个线程,并在随后的某个时间自动运行。
继承ExecutorService接口、Executor接口。
publicinterfaceexecutorserviceextendsexecutor { tfuturetsubmit,callablettask}; tfuturetsubmit (可运行任务,T result ); YouTube? 提交(运行任务); } publicinterfaceexecutor { void execute (可运行命令); }提交和执行之间的区别:
submit有返回值,execute没有
使用返回值的示例,例如,有很多task可以验证数据。 所有的task都将运行,每个task都会告诉我其运行结果。 如果失败了,原因是什么? 然后,合并所有失败的原因并返回。
提交对于处理Exception很有用
为了能在外面感知到task内部的exception,只能使用submit捕捉Future.get抛出的异常。
例如,有很多更新数据的task希望一个task失败后,其他task不需要运行。 这需要catch Future.get抛出的异常。 然后停止执行其他任务。
即使是相同的submit方法,参数Runnable和Callable也略有不同。
当Callable对象传递给ExecutorService的submit方法时,该call方法会自动在线程中执行,并返回执行结果的Future对象。 将Runnable对象传递给ExecutorService的submit方法时,该run方法会自动在线程中执行,并返回执行结果的Future对象,但会在该Future对象上调用get方法