juc笔记之callable详解
文章目录
- 一、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详解相关推荐
- ELK学习笔记之Logstash详解
0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...
- expect学习笔记及实例详解【转】
1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示: 1.1 首行加上/usr/bin/expect 1.2 spawn: 后面加上需要执行的shell命令,比如说 ...
- Java中大数据数组,Java基础学习笔记之数组详解
摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...
- oracle scn 重置,学习笔记:Oracle SCN详解 SCN与Oracle数据库恢复的关系
天萃荷净 分享一篇关于Oracle SCN的详解,介绍SCN与Oracle数据库恢复的关系和SCN在数据库中的作用 一.为什么需要System checkpoint SCN号与Datafile Che ...
- 多线程之callable详解
多线程之callable详解 面试有人会问:线程的实现方式有几种? 很多人可能回答:2种,继承Thread类,实现Runnable接口. 很多忽略了callable这种方式. 也许有人知道callab ...
- PyTorch入门笔记-matmul函数详解
PyTorch入门笔记-matmul函数详解 本文转载自:PyTorch入门笔记-matmul函数详解 - 腾讯云开发者社区-腾讯云 (tencent.com) 41409)]
- PyQt5学习笔记——一文详解QObject
QObject详解笔记1 一.简介 QObject是所有Qt对象的基类 二.功能作用 2.1 对象名称.属性 2.1.1 API setObjectName("唯一名称") 给QT ...
- shell入门学习笔记-12-命令详解: echo与printf
系列目录与参考文献传送门: shell入门学习笔记-序章 命令详解 admindeMacBook-Pro:myshell admin$ type cd cd is a shell builtin ad ...
- CoAP学习笔记——CoAP格式详解
0 前言 CoAP是受限制的应用协议(Constrained Application Protocol)的代名词.在当前由PC机组成的世界,信息交换是通过TCP和应用层协议HTTP实现的.但是对于小型 ...
最新文章
- 【CTF】实验吧 古典密码
- 三十、赫夫曼树的设计与代码实现
- 《强化学习周刊》第35期:强化学习在智能交通中的最新应用
- ML之HierarchicalClustering:自定义HierarchicalClustering层次聚类算法
- 直播预告丨揭秘神策数据销售方法论,一起向 Top Sales 迈进!
- 十分钟熟练Dockerfile指令
- 基本类型和字符串互相转换
- 为什么要破坏JVM的双亲委派模型
- Java中try catch finally语句中含有return语句的执行情况
- 编写 iPhone Friendly 的 Web 应用程序 (Part 6 - iUI)
- 【学习 OpenCV】—— imgproc.hpp 核心api
- -32767转化为二进制_谁说前端不需要懂二进制
- CASIA WebFace、WIDDER FACE、FDDB、AFLW、CelebA训练集详解
- Java实现的各种排序算法
- 文章三 国家助学贷款-还款
- proxy代理配置及解析
- 乐山计算机学校学籍管理,乐山计算机学校学生管理系统设计与实现
- fatal Couldn‘t find remote ref master
- 根据 Excel 中的数据批量修改文件的扩展名
- 批量实现excel中的地名转为经纬度
热门文章
- 软件开发走软件外包平台的几大理由
- U盘在任务栏有显示,但是在我的电脑里面没显示
- telnet 邮件服务器25 端口 Connection refused
- Android动画之translate(位移动画)上下移动
- EOS超级节点选举竟被恶意操控?那21个节点的背后踩着多少森森白骨
- xss sql注入 php,利用xss 执行sql注入
- 计算机视觉-目标检测论文中proposal翻译理解
- 建站教程,从无到有(2)——把你的域名变成可供访问的简单网页!
- Google Earth Engine(GEE)——土地分类/覆盖案例分析含各类土地面积统计和精度评定(印度班加罗尔为例)
- excel 置信区间 计算_Excel中用什么函数可以算置信区间,怎么算啊?