Callable<>和Runable类似,都是用于Java的并发执行。

  唯一的区别是,Runable的run方法的返回是void,而Callable的call方法是有返回值的。

  call方法返回的类型是实现Callable<?>泛型接口时所指定的类型,不然会编译出错。

  那么,怎样获取call方法的返回值呢?——通过执行Callable,可以返回的Future对象,通过调用future对象的get方法来获取call方法的返回值。

  综上,你把Callable当成是有返回值的Runable就行了,只不过Callable的是call,Runable的是run。

  下面是演示代码:

 import java.util.ArrayList;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future; public class CallableTest{
public static void main(String[] args) {
ExecutorService executorService= //创建线程池
Executors.newCachedThreadPool();
ArrayList<Future<String>> list=
new ArrayList<Future<String>>();
for (int i = 0; i < 10; i++) {
list.add(executorService //通过submit方法来提交Callable到线程池中执行
.submit(new TaskWithResult()));
}
for (Future<String> future : list) {
try {
System.out.println(future.get()); //通过get方法来获取call返回值
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
} static class TaskWithResult implements Callable<String>{
private static int taskNum=0;
private int taskId=taskNum;
public TaskWithResult() {
taskNum++;
} @Override
public String call() throws Exception {
try {
Thread.sleep(this.taskId*1000); //我制造的时间差,更直观地显示call和run方法的相似性。
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Result of TaskWithResult: "+this.taskId;
} } }

  运行结果:

  Result of TaskWithResult: 0
  Result of TaskWithResult: 1
  Result of TaskWithResult: 2
  Result of TaskWithResult: 3
  Result of TaskWithResult: 4
  Result of TaskWithResult: 5
  Result of TaskWithResult: 6
  Result of TaskWithResult: 7
  Result of TaskWithResult: 8
  Result of TaskWithResult: 9

  以上的运行结果是每隔一秒打印一行的,这说明,call和run是差不多的。

  

【Thinking in Java】Java Callable的使用的更多相关文章

  1. java 多线程 Callable中的futrue模式

    java实现Callable接口中用到了future模式,所以实现了这个接口就看到了有返回值,那它的基本原理是什么鬼,往下看. 何为future模式? future模式有点类似于商品订单.在网上购物时 ...

  2. Java Callable Future Example(java 关于Callable,Future的例子)

    Home » Java » Java Callable Future Example Java Callable Future Example April 3, 2018 by Pankaj 25 C ...

  3. Java线程--Callable使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871727.html Java线程--Callable使用 Callable和Runnabl ...

  4. Java/Java Web中乱码解决汇总

    在开发Java/Java Web Application过程中,往往会出现乱码问题,而且有的时候真会弄得人很烦,浪费太多的时间. 记得之前看过一篇帖子,详细解释了Encoding/Decoding过程 ...

  5. 新手如何学习Java——Java学习路线图

    推荐初学者阅读:新手如何学习Java——Java学习路线图

  6. [Jmeter]通过批处理调用java,java从CSV动态读取登录的用户名和密码,并将其作为参数组合成字符串,写入外部.bat文件,然后通过Java执行这个外部批处理文件

    问题1:怎样通过批处理调用java代码? 问题2:怎样通过java从CSV文件获取到用户名和密码存入变量? 问题3:怎样将获取到的用户名和密码组合成字符串,写入外部批处理文件? 问题4:怎样在批处理文 ...

  7. [JAVA] JAVA 类路径

    Java 类路径 类路径是所有包含类文件的路径的集合. 类路径中的目录和归档文件是搜寻类的起始点. 虚拟机搜寻类 搜寻jre/lib和jre/lib/ext目录中归档文件中所存放的系统类文件 搜寻再从 ...

  8. JAVA | Java对象的内存分配过程是如何保证线程安全的?

    JAVA | Java对象的内存分配过程是如何保证线程安全的? 专注于Java领域优质技术,欢迎关注 作者 l Hollis 来源 l Hollis(ID:hollischuang) JVM内存结构, ...

  9. SonarQube执行代码分析时,报错ERROR: Unable to create symbol table for : /**/*.java java.lang.IllegalArgumentException: Unsupported class file major version 55

    若要转载本文,请务必声明出处:https://www.cnblogs.com/zhongyuanzhao000/p/11686633.html 起因: 最近正在尝试SonarQube的简单使用,但是当 ...

  10. Log4j log for java(java的日志) 的使用

    log4j的使用,Log4j log for java(java的日志) 是java主流的日志框架,提供各种类型,各种存储,各种格式,多样化的日志服务. 可以再Apache官网下载得到. 我们下载lo ...

随机推荐

  1. java 截取url的参数

    /** * 去掉url中的路径,留下请求参数部分 * @param strURL url地址 * @return url请求参数部分 * @author lzf */ private static S ...

  2. Python3

    1.上节内容回顾 递归: 明确的结束条件 问题规模每递归一次都应该比上一次的问题规模有所减少 效率低 高阶函数 文件: rb.wb.ab 一般用在不同系统之间传数据,和传视频流的时候用到,一般以这种形 ...

  3. ef 对象无法序列化的问题(System.Data.Entity.DynamicProxies)

    错误提示: System.InvalidOperationException: 生成 XML 文档时出错. ---> System.InvalidOperationException: 不应是类 ...

  4. linux命令(2):cd命令

    Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的. 所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1.  ...

  5. 无cookie下载Oracle otn上的sun jdk等软件

    从Oracle下载sun jdk提示:In order to download products from Oracle Technology Network you must agree to th ...

  6. C# 从字符串中取出英文字母

    string fid = context.Request["value2"];//fid=FCT1234 Regex re = new Regex(@"[a-zA-Z]+ ...

  7. 解决 VMWARE MAC 10.12无法全屏的问题

    昨天我在VMware上装了10.10,然后通过APP store 升级了系统到 10.12,升级前安装VMware tools 能自动全屏,可是升级后不行. 然后在网上查了很多资料,发现并没有这方面的 ...

  8. js- this

    this对象是基于函数在执行的环境绑定的. (一)   this 在闭包环境中指向的对象. <Js高级程序设计>中提到: 每个函数在被调用时,其活动对象都会自动取得两个特殊变量:this和 ...

  9. Handler使用总结(转)

    方法一:(java习惯,在android平台开发时这样是不行的,因为它违背了单线程模型) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread ...

  10. git worktree

    git clone,不管是single-branch,还是non-single-branch,如果同时存在几个clone出来的branches,随着时间的推移,不停的编译.更新.编译...每个bran ...