Java用Callable接口创建线程
一、概述
使用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接口创建线程相关推荐
- Java多线程(6)--Callable接口创建线程
与使用Runnable相比, Callable功能更强大些 ①相比run()方法,可以有返回值 ②方法可以抛出异常 ③支持泛型的返回值 ④需要借助FutureTask类,可以获取返回结果 Future ...
- 【多线程】采用Callable接口创建线程
前言 java5开始,提供了Callable接口,是Runable接口的增强版.同样用Call()方法作为线程的执行体,增强了之前的run()方法.因为call方法可以有返回值,也可以声明抛出异常. ...
- Callable接口-创建线程的第三种方法
Callable和Runable相比 //Runnable和Callable区别 //1.Callable带返回值 //2.run()不会抛异常,call()会抛异常 //3.实现的接口不同 pack ...
- 【Java】线程创建方式:Callable接口 / 使用线程池
面试题:创建多线程有有哪几种方式? 回答:4种. 实现Runnable接口(重写Run方法) 继承Thread类 实现Callable接口(重写Call方法,与Run不同的是,Call方法有返回值) ...
- executor线程池框架_如何使用Java 5 Executor框架创建线程池
executor线程池框架 Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸 ...
- 如何使用Java 5 Executor框架创建线程池
Java 5以Executor框架的形式在Java中引入了线程池,它允许Java程序员将任务提交与任务执行分离. 如果要使用Java进行服务器端编程,则线程池是维护系统可伸缩性,鲁棒性和稳定性的重要概 ...
- 使用Runnable接口创建线程,很简单
大家好,今天分享.使用Runnable接口创建线程 首先Java创建线程可以通过三种方法: 即: 1.继承Thread类创建线程类(重点) 2.通过Runnable接口创建线程类(重点) 3.通过Ca ...
- 实现Callable接口创建多线程
新增方式一:实现Callable接口 与Runnable相比,Callable功能更强大些 相比run()方法,可以有返回值 方法可以抛出异常 支持泛型的返回值 需要借助FutureTask类,比如获 ...
- Java 并发 多线程:创建线程的四种方式
Java 并发 多线程: 创建线程的四种方式 继承 Thread 类并重写 run 方法 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式创建 1. 通过继承 Thread ...
最新文章
- C++知识点1——基础
- python导入py文件-关于python:如何从另一个目录导入.py文件?
- 【译】JS基础算法脚本:类数组(arguments)去重
- Ubuntu 12.04搭建MTK 6577 安卓开发环境
- Nacos安装和服务注册
- 给硬件工程师介绍SAP Cloud for Customer
- 系统带你学习 WebAPIs 第五讲
- 肖仰华 | 领域知识图谱落地实践中的问题与对策
- LVS学习笔记之三种模式的特点概括
- 电力技术监督导则_会议报道:2019年电力行业燃煤发电企业节能监督管理专业技术人员及燃煤发电机组能效水平对标管理办法培训班...
- HFSS脚本建模入门
- 使用可靠多播与OPENDDS进行数据分发
- python opencv 二值化 计算白色像素点并计算比例输出可视化
- LED背光源的正反面怎么区分?
- 第1章Activity的生命周期和启动模式
- 换个方式认识一下——微信公众号搜索公众号列表 API
- ubuntu14.04安装谷歌输入法
- 网络安全实验之《ARP欺骗攻击》实验报告
- Arduino休眠模式和看门狗以及中断详解
- html 表格自动编号,Word中如何给表格设置自动编号
热门文章
- 菜鸟教程python3循环语句_详细记录python的range()函数用法|python3菜鸟教程
- 前端下载图片、pdf、excel、world文件;前端下载图片和pdf文件;前端a标签下载图片和pdf文件;下载文件名称不生效原因。
- 一个网恋致毁者的独白
- 微信绑定/解绑设备ticket
- python中shift函数_pandas DataFrame.shift()函数
- 【航母特辑】06_乐观锁和悲观锁的业务场景以及使用案例,这篇很全
- java寂静岭 攻略,寂静岭1
- android手机内存不足 拍照 闪退,手机老闪退?多是内存不足惹的祸
- AI+智慧城市,建设繁荣宜居天津滨海新区
- 【邢不行|量化小讲堂系列23-Python量化入门】不用再自己写技术指标了 | TA-lib视频教程