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接口的更多相关文章

  1. 高并发之——深入解析Callable接口

    本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小. 1.Callable接口介绍 Callable接口是JDK1.5新增的泛型接 ...

  2. 【高并发】深入解析Callable接口

    大家好,我是冰河~~ 本文纯干货,从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小. 1.Callable接口介绍 Callable接口是J ...

  3. Future接口和Callable接口以及FeatureTask详解

    类继承关系 Callable接口 @FunctionalInterface public interface Callable<V> { V call() throws Exception ...

  4. 5.创建执行线程的方式之三 :实现Callable 接口

    Callable 接口 一.Java 5.0 在 java.util.concurrent 提供了 一个新的创建执行线程的方式(之前有继承Thread 和 实现Runnable):Callable 接 ...

  5. JDK 5.0 新增解决线程安全 Callable接口和线程池

    在jdk5.0后又新增了两种解决线程安全的问题 一: 实现Callable接口, 实现接口步骤: 1: 创建一个实现Callable接口的实现类 2: 实现Callable接口中的call()方法, ...

  6. Java之创建线程的方式三:实现Callable接口

    import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util ...

  7. 创建线程的方式三:实现Callable接口-----JDK5.0 新增

    package com.yhqtv.java2; /* * 创建线程的方式三:实现Callable接口-----JDK5.0 新增 * * 如何理解实现Callable接口的方式创建多线程比实现Run ...

  8. 创建线程的方式三:实现Callable接口 --- JDK 5.0新增

    /** * 创建线程的方式三:实现Callable接口. --- JDK 5.0新增 * * * 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大? * 1 ...

  9. JUC之Callable接口回顾和JUC辅助类

    Callable接口和JUC辅助类 Callable接口: 回顾: 创建线程的四种方式: 继承Thread 实现runnable接口 实现callable接口 使用线程池 之前的文章:多线程编程1-定 ...

随机推荐

  1. WPF新手快速入门系列 2.绑定

    [概要] 上一章讲了布局,按照市面上的书籍每一本讲的顺序都不一样,本系列是希望大家能快速上手去应对工作需要,所以本章就直接开始讲绑定. 如有学习过程中想交流学习.疑惑解答可以来此QQ群交流:58074 ...

  2. HDU - 1005 -Number Sequence(矩阵快速幂系数变式)

    A number sequence is defined as follows:  f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) m ...

  3. 条件竞争(race condition)

    条件竞争漏洞是一种服务器端的漏洞,由于服务器端在处理不同用户的请求时是并发进行的,因此,如果并发处理不当或相关操作逻辑顺序设计的不合理时,将会导致此类问题的发生. 参考了一些资料,发现一个比较能说明问 ...

  4. 利用递归方法实现链表反转、前N个节点反转以及中间部分节点反转

    一.反转整个链表 问题:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点. 示例: 输入: 1->2->3->4->5->NULL 输出: 5-&g ...

  5. 反射机制(Java)

    反射机制 今天闲来无事,对反射机制http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html阅读一番,整理了下这方面的知识以及自己的一些心得 ...

  6. python模块hashlib、xlwt、pymysql

    一.xlwt xlwt是python第三方模块,主要是对excel的写操作.xlwt使用时必须先安装. 1.安装 在操作系统的cmd窗口输入pip install xlwt回车即可在线安装. 安装完成 ...

  7. 利用预编译解决C/C++重复定义的错误 -2020.09.13

    利用预编译解决C/C++重复定义的错误 -2020.09.13 我们现在有main.c和function.h两个文件 main.c #include <stdio.h> #include ...

  8. JumpServer 架构浅解

    Jumpserver 是一款由python编写开源的跳板机(堡垒机)系统,实现了跳板机应有的功能.基于ssh协议来管理,客户端无需安装agent.完全开源,GPL授权 设计思路 设计一个跳转网关,所有 ...

  9. JS -- 操作符和数组

    一.Javascript常用操作符 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  10. HTML全局属性(global attribute)有哪些(包含H5)

    1.accesskey:提供了为当前元素生成键盘快捷键的提示.这个属性由空格分隔的字符列表组成.浏览器应该使用在计算机键盘布局上存在的第一个. 2.autocapitalize:控制用户的文本输入是否 ...