Java线程(5)Callable和Future
来源:互联网 发布:织梦dedecms 编辑:程序博客网 时间:2024/06/06 05:20
文章来源:http://blog.sina.com.cn/s/blog_6560efc9010185er.html
接着上一篇继续并发包的学习,本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果。
Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子:
- public class CallableAndFuture {
- public static void main(String[] args) {
- Callable callable = new Callable() {
- public Integer call() throws Exception {
- return new Random().nextInt(100);
- }
- };
- FutureTask future = new FutureTask(callable);
- new Thread(future).start();
- try {
- Thread.sleep(5000);// 可能做一些事情
- System.out.println(future.get());
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- }
- }
下面来看另一种方式使用Callable和Future,通过ExecutorService的submit方法执行Callable,并返回Future,代码如下:
- public class CallableAndFuture {
- public static void main(String[] args) {
- ExecutorService threadPool = Executors.newSingleThreadExecutor();
- Future future = threadPool.submit(new Callable() {
- public Integer call() throws Exception {
- return new Random().nextInt(100);
- }
- });
- try {
- Thread.sleep(5000);// 可能做一些事情
- System.out.println(future.get());
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- }
- }
执行多个带返回值的任务,并取得多个返回值,代码如下:
- public class CallableAndFuture {
- public static void main(String[] args) {
- ExecutorService threadPool = Executors.newCachedThreadPool();
- CompletionService cs = new ExecutorCompletionServic
e(threadPool); - for(int i = 1; i < 5; i++) {
- final int taskID = i;
- cs.submit(new Callable() {
- public Integer call() throws Exception {
- return taskID;
- }
- });
- }
- // 可能做一些事情
- for(int i = 1; i < 5; i++) {
- try {
- System.out.println(cs.take().get());
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (ExecutionException e) {
- e.printStackTrace();
- }
- }
- }
- }
其实也可以不使用CompletionService,可以先创建一个装Future类型的集合,用Executor提交的任务返回值添加到集合中,最后便利集合取出数据,代码略。
0 0
- Java线程(5)Callable和Future
- Java线程(七)----Callable和Future
- Java线程:Callable和Future
- 【Java线程】Callable和Future
- Java线程:Callable和Future
- Java线程:Callable和Future
- 【Java线程】Callable和Future
- Java线程:Callable和Future
- Java线程:Callable和Future
- Java线程:Callable和Future
- 线程--Callable和Future
- Java线程(七):Callable和Future
- Java线程(六):Callable和Future
- Java线程(六):Callable和Future
- Java线程(六):Callable和Future
- Java线程(六):Callable和Future
- Java线程(六):Callable和Future
- Java线程(七):Callable和Future
- mysql 的官网在哪下载源码包呀
- hdu4638 Group(离线线段树)
- poj 1170 Shopping Offers
- Windows Sockets 网络编程——第三章 TCP/IP协议服务
- Codeforces Round #249 (Div. 2) D. Special Grid (递推乱搞)(好题)
- Java线程(5)Callable和Future
- iOS的三种弹框
- C++指针数组和指向指针的指针
- dos启动mysql时发生系统错误5拒绝访问的问题
- JavaWeb 的监听器
- 为什么/usr/local/apache2/bin/apxs明明存在,安装module的时候总是提示请指定有效的apxs路径呢?
- Java线程(6)锁对象Lock-同步问题更完美的处理方式
- 网络编程系列之十一 radius客户端(802.1x客户端)
- [c]sdnuoj1044 花瓶插花