1. package com;
  2.  
  3. import java.util.concurrent.*;
  4.  
  5. /**
  6. * Created by yangyu on 16/11/28.
  7. */
  8.  
  9. /**
  10. * Callable and Future用法
  11. * Callable可以被ExecutorService的submit方法使用,可以取线程执行的返回值;
  12. *
  13. * Future是返回值的封装类型:
  14. * get()方法阻塞当前线程直到获取到返回值
  15. * isDone()方法判断线程是否执行完成
  16. * isCancelled()方法判断线程是否被中断
  17. * cancel(boolean mayInterruptIfRunning)方法中断线程,但是线程方法内必须有中断判断interrupted(),否则是无法中断线程的
  18. */
  19. public class TestCallableAndFuture {
  20.  
  21. private static class Data{
  22. public int sum;
  23. }
  24.  
  25. /**
  26. * Callable实现
  27. */
  28. private static class TaskCall implements Callable<Integer>{
  29.  
  30. @Override
  31. public Integer call() throws Exception {
  32. int sum = 0;
  33. for (int i = 0; i < 1000; i++) {
  34. sum = sum+i;
  35. }
  36. return sum;
  37. }
  38. }
  39.  
  40. /**
  41. * Runnable实现,并且判断了线程是否被中断interrupted()
  42. */
  43. private static class TaskRun implements Runnable{
  44.  
  45. private Data data;
  46.  
  47. TaskRun(Data data){
  48. this.data = data;
  49. }
  50.  
  51. @Override
  52. public void run() {
  53. for (int i = 0; i < 10000; i++) {
  54. /**
  55. * 判断线程如果被中断则跳出循环
  56. */
  57. if (Thread.interrupted())
  58. break;
  59. data.sum = data.sum+i;
  60. }
  61. }
  62. }
  63.  
  64. public static void main(String[] args) {
  65. Data data = new Data();
  66. /**
  67. * 初始化一个可缓存线程池
  68. */
  69. ExecutorService executorService = Executors.newCachedThreadPool();
  70. /**
  71. * submit方法执行Callable
  72. */
  73. Future<Integer> future1= executorService.submit(new TaskCall());
  74. /**
  75. * submit方法执行Runnable,其实future就是对data的封装,实际上使用future.get()返回的是data的引用
  76. */
  77. Future<Data> future2 = executorService.submit(new TaskRun(data),data);
  78.  
  79. try {
  80. System.out.println("future1 isCancelled:"+future1.isCancelled());
  81. System.out.println("future1 result:"+future1.get());
  82. System.out.println("future1 isDone:"+future1.isDone());
  83.  
  84. /**
  85. * 中断线程
  86. */
  87. //future2.cancel(true);
  88. if (!future2.isCancelled())
  89. {
  90. System.out.println("future2 result:"+future2.get().sum);
  91. System.out.println("future2 isDone:"+future2.isDone());
  92. }
  93.  
  94. System.out.println(data.sum);
  95. } catch (InterruptedException e) {
  96. e.printStackTrace();
  97. } catch (ExecutionException e) {
  98. e.printStackTrace();
  99. }
  100. System.out.println("完成");
  101.  
  102. }
  103. }

Java--Callable与返回值future的更多相关文章

  1. paip.java 多线程参数以及返回值Future FutureTask 的使用.

    paip.java 多线程参数以及返回值Future FutureTask 的使用. 在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果. 所以run的返回值是vo ...

  2. Java多线程带返回值的Callable接口

    Java多线程带返回值的Callable接口 在面试的时候,有时候是不是会遇到面试会问你,Java中实现多线程的方式有几种?你知道吗?你知道Java中有可以返回值的线程吗?在具体的用法你知道吗?如果两 ...

  3. 在Java 线程中返回值的用法

    http://icgemu.iteye.com/blog/467848 在Java 线程中返回值的用法 博客分类: Java Javathread  有时在执行线程中需要在线程中返回一个值:常规中我们 ...

  4. 测试 多线程 实现 callable 带返回值

    package threadTest; import java.util.ArrayList; import java.util.Date; import java.util.concurrent.C ...

  5. java 代码执行cmd 返回值异常 (关于JAVA Project.waitfor()返回值是1)

    关于JAVA Project.waitfor()返回值是1   0条评论 Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明. 这时对源代码调试了一下,发现Project ...

  6. 为什么Java不能以返回值区分重载方法?

    读者可能会想:"在区分重载方法的时候,为什么只能以类名和方法的形参列表作为标准呢?能否考虑用方法的返回值来区分呢?" 比如下面两个方法,虽然他们有相同的名字和形式参数,但却很容易区 ...

  7. 谁说java里面有返回值的方法必须要有返回值,不然会报错????

    慢慢的总是发现以前的学得时候有些老师讲的不对的地方! 所以还是尽量别把一些东西说的那么绝对,不然总是很容易误导别人,特别是一些你自己根本就没有试过的东西,然后又斩钉截铁的告诉别人,这样不行,肯定不行什 ...

  8. java递归算法提前返回值带出

    /** * */ package testJava.java.foreach; import java.util.ArrayList; import java.util.LinkedList; imp ...

  9. 10-02 Java 形式参数和返回值的问题深入研究,链式编程

    形式参数和返回值的问题: 1:形式参数和返回值的问题(理解) (1)形式参数: 类名:需要该类的对象 抽象类名:需要该类的子类对象 接口名:需要该接口的实现类对象 (2)返回值类型: 类名:返回的是该 ...

随机推荐

  1. IOS SWIFT 启动流程学习

    其实和我们java.c一样通过一个main函数作为入口. main封装在了UIApplicationMain里面.所以后者变成启动入口. 他会扫描Info.plist,找到需要加载的入口storybo ...

  2. Python virtualenv with Sublime Text 3

    背景介绍 最近喜欢上了Sublime编辑器,刚开始学着用.不过对我这个python狂人来讲,首要问题是需要sublime支持python virtualenv包的导入.所以我就找了google最后找到 ...

  3. css双飞翼布局

     双飞翼布局是一种比较灵活的布局,始于淘宝UED,玉伯提出的,他着重介绍的是双飞翼栅格布局. 三列布局为"双飞燕"布局,可以把三栏比作一只鸟,main部分相当是于鸟的身体,而lef ...

  4. MVC validate.js下使用 ajaxSubmit

    首页定义验证实体 using System.ComponentModel.DataAnnotations; using System.Web.Mvc; namespace MvcApplication ...

  5. salesforce 零基础学习(五十)自定义View或者List以及查看系统原来的View或者List

    salesforce给我们提供了标准的页面,比如标准的页面包括标准的列表和标准的详细页视图.有的时候我们想要自定义视图,比如做一个项目的时候不希望使用者直接通过ID查看到标准的详细页,而是跳转到指定处 ...

  6. MyEclipse中屏蔽js检验

    方法一: 右键工程-->properties-->Myeclipse-->validation-->Excluded Resource,勾选需要取消验证的文件或者文件夹就可以了 ...

  7. Redux

    redux是Flux的一种实现方式,但还是和Flux有些不同. React控制视图层,要想做一个完整的数据流,必须要用react-redux. 官方demo,自己收集了一下: demo1http:// ...

  8. 手把手教你用nodejs+SQL Server2012做增删改查

    1.开发工具WebStorm 10.0.4 2.打开WebStorm 10.0.4新建项目:

  9. Js权限判断处理

    主要实现自动处理视频点击判断权限. function lookVideo() { var review_con = document.getElementById("review" ...

  10. jquery实现的网页选项卡(拾忆)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...