executorservice用法详解

上传人:第*** 文档编号:30598921 上传时间:2018-01-30 格式:DOC 页数:8 大小:75KB
返回 下载 相关 举报
executorservice用法详解_第1页
第1页 / 共8页
executorservice用法详解_第2页
第2页 / 共8页
executorservice用法详解_第3页
第3页 / 共8页
executorservice用法详解_第4页
第4页 / 共8页
executorservice用法详解_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《executorservice用法详解》由会员分享,可在线阅读,更多相关《executorservice用法详解(8页珍藏版)》请在金锄头文库上搜索。

1、ExecutorService 用法详解接口 java.util.concurrent.ExecutorService 表述了异步执行的机制,并且可以让任务在后台执行。壹個 ExecutorService 实例因此特别像壹個线程池。事实上,在 java.util.concurrent 包中的 ExecutorService 的实现就是壹個线程池的实现。 ExecutorService 样例 这里有壹個简单的使用 Java 实现的 ExectorService 样例: ExecutorService executorService = Executors.newFixedThreadPool(1

2、0);executorService.execute(new Runnable() public void run() System.out.println(Asynchronous task););executorService.shutdown();首先使用 newFixedThreadPool() 工厂方法创建壹個 ExecutorService ,上述代码创建了壹個可以容纳 10 個线程任务的线程池。其次,向 execute() 方法中传递壹個异步的 Runnable 接口的实现,这样做会让 ExecutorService 中的某個线程执行这個 Runnable 线程。 任务的委托(T

3、ask Delegation) 下方展示了一个线程的把任务委托异步执行的 ExecutorService 的示意图。 壹旦线程把任务委托给 ExecutorService,该线程就会继续执行与运行任务无关的其它任务。ExecutorService 的实现由于 ExecutorService 只是壹個接口,你壹量需要使用它,那麽就需要提供壹個该接口的实现。ExecutorService 接口在 java.util.concurrent 包中有如下实现类: ThreadPoolExecutor ScheduledThreadPoolExecutor 创建壹個 ExecutorService 你可以

4、根据自己的需要来创建壹個 ExecutorService ,也可以使用 Executors 工厂方法来创建壹個 ExecutorService 实例。这里有几個创建 ExecutorService 的例子: ExecutorService executorService1 = Executors.newSingleThreadExecutor();ExecutorService executorService2 = Executors.newFixedThreadPool(10);ExecutorService executorService3 = Executors.newScheduled

5、ThreadPool(10);ExecutorService 使用方法 这里有几种不同的方式让你将任务委托给壹個 ExecutorService: execute(Runnable)submit(Runnable)submit(Callable)invokeAny(.)invokeAll(.)我会在接下来的内容里把每個方法都看壹遍。 execute(Runnable) 方法 execute(Runnable) 接收壹個 java.lang.Runnable 对象作为参数,并且以异步的方式执行它。如下是壹個使用 ExecutorService 执行 Runnable 的例子: ExecutorS

6、ervice executorService = Executors.newSingleThreadExecutor();executorService.execute(new Runnable() public void run() System.out.println(Asynchronous task););executorService.shutdown();使用这种方式没有办法获取执行 Runnable 之后的结果,如果你希望获取运行之后的返回值,就必须使用 接收 Callable 参数的 execute() 方法,后者将会在下文中提到。 submit(Runnable) 方法 su

7、bmit(Runnable) 同样接收壹個 Runnable 的实现作为参数,但是会返回壹個 Future 对象。这個 Future 对象可以用于判断 Runnable 是否结束执行。如下是壹個 ExecutorService 的 submit() 方法的例子: Future future = executorService.submit(new Runnable() public void run() System.out.println(Asynchronous task););/如果任务结束执行则返回 nullSystem.out.println(future.get()= + futu

8、re.get();submit(Callable) 方法 submit(Callable) 和方法 submit(Runnable) 比较类似,但是区别则在于它们接收不同的参数类型。Callable 的实例与 Runnable 的实例很类似,但是 Callable 的 call() 方法可以返回壹個结果。方法 Runnable.run() 则不能返回结果。Callable 的返回值可以从方法 submit(Callable) 返回的 Future 对象中获取。如下是壹個 ExecutorService Callable 的样例: Future future = executorService.

9、submit(new Callable()public Object call() throws Exception System.out.println(Asynchronous Callable);return Callable Result;);System.out.println(future.get() = + future.get();上述样例代码会输出如下结果: Asynchronous Callablefuture.get() = Callable ResultinVokeAny() 方法 invokeAny() 接收壹個包含 Callable 对象的集合作为参数。调用该方法不

10、会返回 Future 对象,而是返回集合中某壹個 Callable 对象的结果,而且无法保证调用之后返回的结果是哪壹個 Callable,只知道它是这些 Callable 中壹個执行结束的 Callable 对象。如果壹個任务运行完毕或者抛出异常,方法会取消其它的 Callable 的执行。以下是壹個样例: ExecutorService executorService = Executors.newSingleThreadExecutor();Set callables = new HashSet();callables.add(new Callable() public String ca

11、ll() throws Exception return Task 1;);callables.add(new Callable() public String call() throws Exception return Task 2;);callables.add(new Callable() public String call() throws Exception return Task 3;);String result = executorService.invokeAny(callables);System.out.println(result = + result);execu

12、torService.shutdown();以上样例代码会打印出在给定的集合中的某壹個 Callable 的返回结果。我尝试运行了几次,结果都在改变。有时候返回结果是Task 1,有时候是Task 2,等等。 invokeAll()方法 invokeAll() 会调用存在于参数集合中的所有 Callable 对象,并且返回包含所有 Future 对象的集合,你可以通过这個返回的集合来管理每個 Callable 的执行结果。需要注意的是,任务有可能因为异常而导致运行结束,所以它可能并不是真的成功运行了。但是我们没有办法通过 Future 对象来了解到这個差异。以下是壹個代码样例: Executo

13、rService executorService = Executors.newSingleThreadExecutor();Set callables = new HashSet();callables.add(new Callable() public String call() throws Exception return Task 1;);callables.add(new Callable() public String call() throws Exception return Task 2;);callables.add(new Callable() public Strin

14、g call() throws Exception return Task 3;);List futures = executorService.invokeAll(callables);for(Future future : futures)System.out.println(future.get = + future.get();executorService.shutdown();ExecuteService 服务的关闭 当使用 ExecutorService 完毕之后,我们应该关闭它,这样才能保证线程不会继续保持运行状态。 举例来说,如果你的程序通过 main() 方法启动,并且主线

15、程退出了你的程序,如果你还有壹個活动的 ExecutorService 存在于你的程序中,那么程序将会继续保持运行状态。存在于 ExecutorService 中的活动线程会阻止 Java 虚拟机关闭。 为了关闭在 ExecutorService 中的线程,你需要调用 shutdown() 方法。ExecutorService 并不会马上关闭,而是不再接收新的任务,壹但所有的线程结束执行当前任务,ExecutorServie 才会真的关闭。所有在调用 shutdown() 方法之前提交到 ExecutorService 的任务都会执行。 如果你希望立即关闭 ExecutorService,你可

16、以调用 shutdownNow() 方法。这個方法会尝试马上关闭所有正在执行的任务,并且跳过所有已经提交但是还没有运行的任务。但是对于正在执行的任务,是否能够成功关闭它是无法保证的,有可能他们真的被关闭掉了,也有可能它会壹直执行到任务结束。这是壹個最好的尝试。 shutdown()和 shutdownNow()的区别shutdown():执行后不再接收新任务,如果里面有任务,就执行完;通常 shutdown 之后调用 awaitTermination(long timeout, TimeUnit unit),作用是:后者会阻塞当前线程,等待剩余任务执行完,然后继续往下执行。如果不适用 await,那么 shutdown 之后,很可能导致剩余任务得不到执行(整个程序退出),或是执行出现异常(某些资源被释放之类)。shutdownNow():执

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 外语文库 > 英语学习

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号