深入理解Callable接口
Callable接口:
Callable,新启线程的一种方式,返回结果并且可能抛出异常的任务,在前面的新启线程的文章中用过,但是没有具体讲解
优点:
可以获取线程的执行结果,也称为返回值
通过与Future的结合,可以实现利用Future来跟踪异步计算的结果
Runnable和Callable的区别:
Callable规定的方法是call(),Runnable规定的接口是run();
Callable的任务执行后可返回值,而Runnable的任务是不能有返回值的;
call方法可以抛出异常,run方法不可以
运行Callable任务可以拿到一个Future对象,表示异步计算的结果,它提供了检查是否计算完成的方法,以等待计算的完成,并检索计算的结果,通过Future对象可以了解任务执行情况,可以取消任务的执行,还可以获取执行结果
Future接口:
Future是一个接口,代表了一个异步计算的结果,接口中的方法用来检查计算是否完成,等待完成和得到计算结果;
当计算完成后,只能通过get()方法得到结果,get()方法会阻塞,一直到线程的计算结果完成并返回;
如果想取消,那么调用cancel()方法,其他方法用于确定任务是正常完成还是取消了;
一旦计算完成了,那么这个计算就不能被取消
FutureTask类:
FutureTask类实现了RunnableFuture接口,而RunnableFuture接口是继承了Runnable和Future接口,所以说FutureTask是一个提供异步计算结果的任务;
FutureTask可以用来包装Callable或者Runnable接口的实现对象,因为FutureTask实现了Runnable接口,所以FutureTask也可以提交给线程池
Callable,Future,FutureTask三者之间的关系:

Callable的两种执行方式:
1:借助FutureTask,包装Callable接口的实现类,然后传递给Thread线程执行
package org.dance.day2.future; import org.dance.tools.SleepTools; import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; /**
* Callable的两种执行方式
* @author ZYGisComputer
*/
public class UseCallable { /**
* 实现Callable接口的线程
*/
private static class UseCall implements Callable<Integer>{ private int sum; @Override
public Integer call() throws Exception {
System.out.println("callable子线程开始执行任务计算");
Thread.sleep(2000);
for (int i = 0; i < 5000; i++) {
sum += i;
}
System.out.println("子线程任务计算完成,返回值:"+sum);
return sum;
}
} public static void main(String[] args) throws ExecutionException, InterruptedException { UseCall useCall = new UseCall(); // 使用FutureTask包装
FutureTask<Integer> futureTask = new FutureTask<>(useCall); // 包装为Thread
Thread thread = new Thread(futureTask); thread.start(); // 开始主线程的任务
Random random = new Random(); SleepTools.second(1); if(random.nextBoolean()){
System.out.println("获取Callable result:"+futureTask.get());
}else{
System.out.println("中断计算");
// 中断计算,取消线程的执行
futureTask.cancel(true);
}
} }
2:借助线程池来执行
UseCall useCall = new UseCall();
// 创建一个线程池
ExecutorService executorService = Executors.newCachedThreadPool();
Future<Integer> future = executorService.submit(useCall);
线程池这个只粘贴关键代码,线程池的知识就不在这多说了,之后会具体讲解
返回的Future接口的使用和FutureTask是一样的
这个接口实现的线程,是有返回值的
可以说一下我之前用到的场景
是这样的,我之前用到的一般是用于云上,或者存储服务器下载电子文件,就是本身我一个接口就是需要查询数据库并,进行结果的大量计算和结果转换的,同时还要上云上下载比较大的电子文件,所以我采用Callable配合线程池来完成云上文件的下载;
作者:彼岸舞
时间:2020\10\04
内容关于:并发编程
本文来源于网络,只做技术分享,一概不负任何责任
深入理解Callable接口的更多相关文章
- 高并发之——深入解析Callable接口
本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小. 1.Callable接口介绍 Callable接口是JDK1.5新增的泛型接 ...
- 【高并发】深入解析Callable接口
大家好,我是冰河~~ 本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小. 1.Callable接口介绍 Callable接口是J ...
- Future接口和Callable接口以及FeatureTask详解
类继承关系 Callable接口 @FunctionalInterface public interface Callable<V> { V call() throws Exception ...
- 5.创建执行线程的方式之三 :实现Callable 接口
Callable 接口 一.Java 5.0 在 java.util.concurrent 提供了 一个新的创建执行线程的方式(之前有继承Thread 和 实现Runnable):Callable 接 ...
- JDK 5.0 新增解决线程安全 Callable接口和线程池
在jdk5.0后又新增了两种解决线程安全的问题 一: 实现Callable接口, 实现接口步骤: 1: 创建一个实现Callable接口的实现类 2: 实现Callable接口中的call()方法, ...
- Java之创建线程的方式三:实现Callable接口
import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util ...
- 创建线程的方式三:实现Callable接口-----JDK5.0 新增
package com.yhqtv.java2; /* * 创建线程的方式三:实现Callable接口-----JDK5.0 新增 * * 如何理解实现Callable接口的方式创建多线程比实现Run ...
- 创建线程的方式三:实现Callable接口 --- JDK 5.0新增
/** * 创建线程的方式三:实现Callable接口. --- JDK 5.0新增 * * * 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大? * 1 ...
- JUC之Callable接口回顾和JUC辅助类
Callable接口和JUC辅助类 Callable接口: 回顾: 创建线程的四种方式: 继承Thread 实现runnable接口 实现callable接口 使用线程池 之前的文章:多线程编程1-定 ...
随机推荐
- css面试题汇总 (持续更新)
前言:这篇随笔是为了准备后面的面试而整理的,网上各种面试题太多了,但是我感觉很多太偏了,而且实际开发过程中并不会遇到,因此这里我整理一些比较常用的,或者是相对比较重要的知识点,每个知识点都会由浅入深, ...
- jsBridge
jsBridge https://www.dazhuanlan.com/2019/12/05/5de7eb50739df/ JSBridge的原理 https://juejin.im/post/5ab ...
- 【图像增强】CLAHE 限制对比度自适应直方图均衡化
文章目录: 目录 1 基本概述 2 竞赛中的CLAHE实现 3 openCV绘制直方图 4 对比度Contrast 5 Contrast Stretching 6 Histogram Equaliza ...
- Python 利用三个简易模块熟悉前后端交互流程
准备工作 在学习Django之前,先动手撸一个简单的WEB框架来熟悉一下前后端交互的整体流程 本次用到的模块: 1.wsgiref,这是一个Python自带的模块,用于构建路由与视图 2.pymysq ...
- Spring整合Quartz (cronTrigger和simpleTrigger实现方法)
Spring整合Quartz (cronTrigger和simpleTrigger实现方法) 之前有记录过一次springboot整合Quartz的文章,由于偶尔一次自己使用spring需要整合Qua ...
- Mybatis实例增删改查(二)
创建实体类: package com.test.mybatis.bean; public class Employee { private Integer id; private String las ...
- SpringMVC-08-整合SSM之基本环境搭建
8. 整合SSM 环境要求 IDEA MySQL 5.5 Tomcat 9 Maven 3.5.2 要求: 需要熟练掌握MySQL数据库,Spring,JavaWeb及Mybatis知识,简单的前端知 ...
- 对Jenkinsfile语法说不,开源项目Jenkins Json Build挺你
对Jenkinsfile语法说不,开源项目Jenkins Json Build挺你 项目背景 我所在的组织项目数量众多,使用的语言和框架也很多,比如Java.ReactNative.C# .NET.A ...
- Leetcode 1577 数的平方等于两数乘积的方法数
Leetcode 1577 数的平方等于两数乘积的方法数 题目 给你两个整数数组 nums1 和 nums2 ,请你返回根据以下规则形成的三元组的数目(类型 1 和类型 2 ): 类型 1:三元组 ( ...
- ELK入门及基本使用
预备知识-Restful 起源 在没有前后端分离概念之前,一个网站的完成总是“all in one”,在这个阶段,页面.数据.渲染全部在服务端完成,这样做的最大的弊端是后期维护,扩展极其痛苦,开发人员 ...