一、概述

 使用Callable接口创建线程能够返回数据。与Runnable接口创建线程的方式有点类似,也是需要通过Thread类来创建线程。由于Thread类的构造函数中没有Callable接口,选用了FutureTask类来作为连接创建线程。
FutureTask类实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable, Future接口。在FutureTask类中构造函数可以传入Callable对象,以此建立关系。
 通过FutureTask中的get()方法来获取Callable接口中的call()方法的返回值。

 二、步骤:

1.创建一个类实现Callable接口,实现call()方法。(在FutureTask类中的run()方法实际上就是调用了call()方法 )
 返回值可以任意设置。也可以在指定返回值,如:class MyCallable implements Callable<Integer>
 如:

class MyCallable implements Callable {@Overridepublic Object call() throws Exception {return null;}
}

2.创建一个FutureTask对象,传入Callable对象
 如:

 FutureTask task = new FutureTask(new MyCallable());

3.创建一个线程Thread,传入FutureTask对象。然后调用run()方法,运行该线程。
 如:

Thread thread = new Thread(task);
thread.start();

4.获取call()方法的返回值,通过FutureTask对象调用get()方法。


此外: 因为FutureTask类实现了Runable接口,那么也可以通过线程池来创建线程
 如:

ExecutorService service = new ThreadPoolExecutor(5,5,5, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(10),new ThreadPoolExecutor.DiscardOldestPolicy());
service.submit(task);

  三、案例

 创建一个线程,call()方法返回1-10000的和。


import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class Test {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask task = new FutureTask(new MyCallable());Thread thread = new Thread(task);thread.start();System.out.println(task.get());}}
class MyCallable implements Callable<Integer> {@Overridepublic Integer call() throws Exception {System.out.println(Thread.currentThread().getName()+",正在执行!");int sum = 0;for(int i = 0 ; i <10000 ; i++){sum+=i;}return sum;}
}

 运行结果

Java用Callable接口创建线程相关推荐

  1. Java多线程(6)--Callable接口创建线程

    与使用Runnable相比, Callable功能更强大些 ①相比run()方法,可以有返回值 ②方法可以抛出异常 ③支持泛型的返回值 ④需要借助FutureTask类,可以获取返回结果 Future ...

  2. 【多线程】采用Callable接口创建线程

    前言 java5开始,提供了Callable接口,是Runable接口的增强版.同样用Call()方法作为线程的执行体,增强了之前的run()方法.因为call方法可以有返回值,也可以声明抛出异常. ...

  3. Callable接口-创建线程的第三种方法

    Callable和Runable相比 //Runnable和Callable区别 //1.Callable带返回值 //2.run()不会抛异常,call()会抛异常 //3.实现的接口不同 pack ...

  4. 【Java】线程创建方式:Callable接口 / 使用线程池

    面试题:创建多线程有有哪几种方式? 回答:4种. 实现Runnable接口(重写Run方法) 继承Thread类 实现Callable接口(重写Call方法,与Run不同的是,Call方法有返回值) ...

  5. executor线程池框架_如何使用Java 5 Executor框架创建线程池

    executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...

  6. 如何使用Java 5 Executor框架创建线程池

    Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸缩性,鲁棒性和稳定性的重要概 ...

  7. 使用Runnable接口创建线程,很简单

    大家好,今天分享.使用Runnable接口创建线程 首先Java创建线程可以通过三种方法: 即: 1.继承Thread类创建线程类(重点) 2.通过Runnable接口创建线程类(重点) 3.通过Ca ...

  8. 实现Callable接口创建多线程

    新增方式一:实现Callable接口 与Runnable相比,Callable功能更强大些 相比run()方法,可以有返回值 方法可以抛出异常 支持泛型的返回值 需要借助FutureTask类,比如获 ...

  9. Java 并发 多线程:创建线程的四种方式

    Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...

最新文章

  1. C++知识点1——基础
  2. python导入py文件-关于python:如何从另一个目录导入.py文件?
  3. 【译】JS基础算法脚本:类数组(arguments)去重
  4. Ubuntu 12.04搭建MTK 6577 安卓开发环境
  5. Nacos安装和服务注册
  6. 给硬件工程师介绍SAP Cloud for Customer
  7. 系统带你学习 WebAPIs 第五讲
  8. 肖仰华 | 领域知识图谱落地实践中的问题与对策
  9. LVS学习笔记之三种模式的特点概括
  10. 电力技术监督导则_会议报道:2019年电力行业燃煤发电企业节能监督管理专业技术人员及燃煤发电机组能效水平对标管理办法培训班...
  11. HFSS脚本建模入门
  12. 使用可靠多播与OPENDDS进行数据分发
  13. python opencv 二值化 计算白色像素点并计算比例输出可视化
  14. LED背光源的正反面怎么区分?
  15. 第1章Activity的生命周期和启动模式
  16. 换个方式认识一下——微信公众号搜索公众号列表 API
  17. ubuntu14.04安装谷歌输入法
  18. 网络安全实验之《ARP欺骗攻击》实验报告
  19. Arduino休眠模式和看门狗以及中断详解
  20. html 表格自动编号,Word中如何给表格设置自动编号

热门文章

  1. 菜鸟教程python3循环语句_详细记录python的range()函数用法|python3菜鸟教程
  2. 前端下载图片、pdf、excel、world文件;前端下载图片和pdf文件;前端a标签下载图片和pdf文件;下载文件名称不生效原因。
  3. 一个网恋致毁者的独白
  4. 微信绑定/解绑设备ticket
  5. python中shift函数_pandas DataFrame.shift()函数
  6. 【航母特辑】06_乐观锁和悲观锁的业务场景以及使用案例,这篇很全
  7. java寂静岭 攻略,寂静岭1
  8. android手机内存不足 拍照 闪退,手机老闪退?多是内存不足惹的祸
  9. AI+智慧城市,建设繁荣宜居天津滨海新区
  10. 【邢不行|量化小讲堂系列23-Python量化入门】不用再自己写技术指标了 | TA-lib视频教程