文章目录

  • 一、Callable是什么
  • 二、使用步骤
    • 1.自定义类实现callable接口
    • 2.测试
  • 三、总结

一、Callable是什么

它是一个接口,位于juc包下,代表一个异步的任务,在多线程环境下,使用callable更明智,因为有些时候,我们也许需要获取方法的执行结果,或者得到异常信息,那么使用callable接口要比使用runnable接口来的方便的多。

callable接口里面最重要的一个方法是call()方法,它能够自定义返回值类型,也可以抛出异常,以便程序员看到发生了什么错误。

那下面来看下如何使用callable接口吧。

二、使用步骤

1.自定义类实现callable接口

//范型的意思是作用于方法的返回值。
class MyThread implements Callable<Integer> {@Overridepublic Integer call() {System.out.println("call()"); // 会打印几个call// 耗时的操作return 1024;}
}

2.测试

package com.lhh.callable;import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;public class CalableDemo  {public static void main(String[] args) throws ExecutionException, InterruptedException {// new Thread(new Runnable()).start();// new Thread(new FutureTask<V>()).start();// new Thread(new FutureTask<V>( Callable )).start();new Thread().start(); // 怎么启动CallableMyThread thread = new MyThread();FutureTask futureTask = new FutureTask(thread); // 适配类,可以把它理解为中间商,通过它来联系runnable,因为Thread构造接受的参数为runnable接口。new Thread(futureTask,"A").start();new Thread(futureTask,"B").start(); // 结果会被缓存,效率高//这个get 方法可能会产生阻塞!把他放到最后,假如任务里面是一个非常耗时的操作,那么要等到这个耗时的操作执行完毕之后才能拿到结果。Integer o = (Integer) futureTask.get(); System.out.println(o);}
}

执行结果如下:

咦,很奇怪,我明明开启了两条线程执行任务的呀,怎么突然变成只能看到一个线程的执行结果呢?

这里其实是一个小细节,因为这里面是有缓存的,第一次的执行结果会被缓存起来,等你下次在执行相类似的操作的时候,直接从缓存里面拿就可以了,也就是不再执行call()方法了。

三、总结

callable的讲解到此结束,主要记住它的作用是用来处理多线程下的任务执行的,跟runnable的作用相同,但是它有它的优势

  • 方法有返回值
  • 方法可以抛出异常

runnable使用run方法执行任务,callable使用call()方法执行任务

记住在使用callable的过程当中,需要借助"中间商"FutureTask来连接。

juc笔记之callable详解相关推荐

  1. ELK学习笔记之Logstash详解

    0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...

  2. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell命令,比如说 ...

  3. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  4. oracle scn 重置,学习笔记:Oracle SCN详解 SCN与Oracle数据库恢复的关系

    天萃荷净 分享一篇关于Oracle SCN的详解,介绍SCN与Oracle数据库恢复的关系和SCN在数据库中的作用 一.为什么需要System checkpoint SCN号与Datafile Che ...

  5. 多线程之callable详解

    多线程之callable详解 面试有人会问:线程的实现方式有几种? 很多人可能回答:2种,继承Thread类,实现Runnable接口. 很多忽略了callable这种方式. 也许有人知道callab ...

  6. PyTorch入门笔记-matmul函数详解

    PyTorch入门笔记-matmul函数详解 本文转载自:PyTorch入门笔记-matmul函数详解 - 腾讯云开发者社区-腾讯云 (tencent.com) 41409)]

  7. PyQt5学习笔记——一文详解QObject

    QObject详解笔记1 一.简介 QObject是所有Qt对象的基类 二.功能作用 2.1 对象名称.属性 2.1.1 API setObjectName("唯一名称") 给QT ...

  8. shell入门学习笔记-12-命令详解: echo与printf

    系列目录与参考文献传送门: shell入门学习笔记-序章 命令详解 admindeMacBook-Pro:myshell admin$ type cd cd is a shell builtin ad ...

  9. CoAP学习笔记——CoAP格式详解

    0 前言 CoAP是受限制的应用协议(Constrained Application Protocol)的代名词.在当前由PC机组成的世界,信息交换是通过TCP和应用层协议HTTP实现的.但是对于小型 ...

最新文章

  1. 【CTF】实验吧 古典密码
  2. 三十、赫夫曼树的设计与代码实现
  3. 《强化学习周刊》第35期:强化学习在智能交通中的最新应用
  4. ML之HierarchicalClustering:自定义HierarchicalClustering层次聚类算法
  5. 直播预告丨揭秘神策数据销售方法论,一起向 Top Sales 迈进!
  6. 十分钟熟练Dockerfile指令
  7. 基本类型和字符串互相转换
  8. 为什么要破坏JVM的双亲委派模型
  9. Java中try catch finally语句中含有return语句的执行情况
  10. 编写 iPhone Friendly 的 Web 应用程序 (Part 6 - iUI)
  11. 【学习 OpenCV】—— imgproc.hpp 核心api
  12. -32767转化为二进制_谁说前端不需要懂二进制
  13. CASIA WebFace、WIDDER FACE、FDDB、AFLW、CelebA训练集详解
  14. Java实现的各种排序算法
  15. 文章三 国家助学贷款-还款
  16. proxy代理配置及解析
  17. 乐山计算机学校学籍管理,乐山计算机学校学生管理系统设计与实现
  18. fatal Couldn‘t find remote ref master
  19. 根据 Excel 中的数据批量修改文件的扩展名
  20. 批量实现excel中的地名转为经纬度

热门文章

  1. 软件开发走软件外包平台的几大理由
  2. U盘在任务栏有显示,但是在我的电脑里面没显示
  3. telnet 邮件服务器25 端口 Connection refused
  4. Android动画之translate(位移动画)上下移动
  5. EOS超级节点选举竟被恶意操控?那21个节点的背后踩着多少森森白骨
  6. xss sql注入 php,利用xss 执行sql注入
  7. 计算机视觉-目标检测论文中proposal翻译理解
  8. 建站教程,从无到有(2)——把你的域名变成可供访问的简单网页!
  9. Google Earth Engine(GEE)——土地分类/覆盖案例分析含各类土地面积统计和精度评定(印度班加罗尔为例)
  10. excel 置信区间 计算_Excel中用什么函数可以算置信区间,怎么算啊?