Java线程(七):Callable和Future

Java线程(七):Callable和Future接着上一篇继续并发包的学习 本篇说明的是 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(); } } } 
      
     
    
  
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 ExecutorCompletionService 
   
     (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提交的任务返回值添加到集合中,最后遍历集合取出数据,代码略。更新于2016-02-05,评论中就这个说法引发了讨论,其实是我没有讲清楚,抱歉。这里再阐述一下:提交到CompletionService中的Future是按照完成的顺序排列的,这种做法中Future是按照添加的顺序排列的。所以这两种方式的区别就像评论中fishjam所描述的那样。

       本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/,转载请注明。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202824.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午11:13
下一篇 2026年3月19日 下午11:13


相关推荐

  • GlusterFS缺点分析

    GlusterFS缺点分析原文 http blog sina com cn s blog 6b89db7a0101 htmlGlusterF GNUClusterFi 是一个开源的分布式文件系统 它的历史可以追溯到 2006 年 最初的目标是代替 Lustre 和 GPFS 分布式文件系统 经过八年左右的蓬勃发展 GlusterFS 目前在开源社区活跃度非常之高 这个后起之秀已经俨然与 Lustre

    2026年3月19日
    3
  • Debussy5.4免费分享

    Debussy5.4免费分享debussy5 4 需要的自行下载 附百度云地址 https pan baidu com s 1j 4rBOKhegFyr1 密码 xz3hPS 好东西一定要分享

    2026年3月19日
    2
  • PLSQL Developer 13 注册码

    PLSQL Developer 13 注册码PLSQLDeveloper13注册码,亲测有效!productcode:4vkjwhfeh3ufnqnmpr9brvcuyujrx3n3leserialNumber:226959password:xs374ca

    2022年7月13日
    15
  • linux tail 与 grep

    linux tail 与 greptail-f./a.txttail-f./a.txt./b.txttail-f./*.txttail-f./*.txt|grep–line-buffer’java’find-name’*.txt’-print0|xargs-0-t tail-f|grep–line-buffer’java’tail-10./a.txttail+10./…

    2022年6月4日
    50
  • browserify使用「建议收藏」

    browserify使用「建议收藏」一、简介browserift是javascript编译工具,可以通过预编译方式,将后端的node模块加入javascript中,进而可在前端浏览器上执行。二、安装1、安装nodejs和npmnodejs是node的运行环境,npm是node的包管理工具。它们的安装在此略过(可参数本博客其它文章)。2、browserify安装命令:npminstall-gbrowserify三、使…

    2025年7月3日
    9
  • 无锁编程CAS[通俗易懂]

    无锁编程CAS[通俗易懂]前言CAS(CompareAndSwap,比较并交换),要说CAS是无锁编程,多多少少有些“标题党”的感觉。因为CAS根据其设计思想,可以划分为乐观锁。不同于synchronized关键字,synchronized实现的是悲观锁。我第一次听说乐观锁和悲观锁的时候有点震惊:一把锁我还得知道它乐不乐观?乐不乐观?一把锁难道还有情绪?实际上乐观锁和悲观锁是基于线程并发竞争的角度来说的,悲观锁就是…

    2022年6月10日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号