Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Runnable和Callable源码及应用解析

Runnable和Callable源码及应用解析

作者头像
余生大大
发布于 2022-11-02 06:55:37
发布于 2022-11-02 06:55:37
20000
代码可运行
举报
文章被收录于专栏:余生大大余生大大
运行总次数:0
代码可运行

1、Runnable源码解析

看一下Runnable的源码,很简单

他的内容这么少是怎么实现我们繁杂的需求和应用呢?

使用Runnable创建一个线程解析一下代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public static void main(String[] args) {
        new Thread(()->{
            System.out.println("我是Runnable");
        }).start();
    }

里面使用Runnable的地方只有传递对象的时候,其他都是使用的Thread而Thread又实现了我们的Runnable,所以Runbale可以理解为执行代码的对象,执行的过程和线程的操作交由Thread控制,Thread源码可以看 ----》Thread源码解析

2、Callable源码解析

Callable的源码,跟Runnable不同的是它不能直接由Thread进行应用启动,还需要一个类Future

Future源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface Future<V> {

    /**
     cancel方法用来取消任务,如果取消任务成功则返回true,如果取消任务失败则返回false。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。
     */
    boolean cancel(boolean mayInterruptIfRunning);

    /**
     isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。
     */
    boolean isCancelled();

    /**
     isDone方法表示任务是否已经完成,若任务完成,则返回true;
     */
    boolean isDone();

    /**
     get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
     */
    V get() throws InterruptedException, ExecutionException;

    /**
     get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。
     */
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

上面的源码可以看到,cancel可以取消任务,isCancelled、isDone可以验证任务是否被取消,get可以获取返回值,但是它是一个接口并不能直接使用,所以就有了它的实现类FutureTask。

看一下FutureTask源码又实现了谁

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class FutureTask<V> implements RunnableFuture<V> {

可以看到又出现了一个新的内容RunnableFuture,看一下它的内容。

FutureTask的构造函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        this.callable = callable;
        this.state = NEW;       // ensure visibility of callable
    }

    public FutureTask(Runnable runnable, V result) {
        this.callable = Executors.callable(runnable, result);
        this.state = NEW;       // ensure visibility of callable
    }

Callabel代码测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ThreadCallabel implements Callable<String>{

    @Override
    public String call() throws Exception {
        System.out.println("到call了");
        return "余生大大";
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 获得执行对象
        ThreadCallabel threadCallabel = new ThreadCallabel();
        // 放入对象
        FutureTask<String> futureTask = new FutureTask(threadCallabel);
        // Thread执行
        new Thread(futureTask).start();
        // 获取返回内容
        String result = futureTask.get();
        // 输入结果
        System.out.println(result);
    }
}

输出内容

还有一种执行方式是通过ExecutorService执行,代码如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ThreadCallabel implements Callable<String>{

    @Override
    public String call() throws Exception {
        System.out.println("到call了");
        return "余生大大";
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建ExecutorService
        ExecutorService executor = Executors.newCachedThreadPool();
        // 获取执行对象
        ThreadCallabel threadCallabel = new ThreadCallabel();
        // 放入执行对象
        FutureTask<String> futureTask = new FutureTask<String>(threadCallabel);
        // 执行
        executor.submit(futureTask);
        // 释放资源
        executor.shutdown();
        // 输出结果
        System.out.println(futureTask.get());
    }
}

执行结果一样

Thread、Runnable是java.lang包下的内容。

Callable、Future、FutrueTask、RunnableFutrue、Executors、ExecutorService都是JUC(java.util.concurrent)包下的内容。

Executors也是创建线程池的工具类。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Akka-CQRS(13)- SSL/TLS for gRPC and HTTPS:自签名证书产生和使用
到现在,我们已经完成了POS平台和前端的网络集成。不过,还是那句话:平台系统的网络安全是至关重要的。前一篇博客里我们尝试实现了gRPC ssl/tls网络连接,但测试时用的证书如何产生始终没有搞清楚。现在akka-http开发的ws同样面临HTTPS的设置和使用问题。所以,特别抽出这篇博文讨论一下数字证书的问题。
用户1150956
2019/06/24
1.6K0
如何制作自签名证书
本文主要介绍如何基于openssl制作X.509自签名证书,以及如何使用该证书签发新证书。
coderhuo
2023/10/21
2.6K0
如何制作自签名证书
Go和HTTPS -2
F为签名函数。CA自己的私钥是唯一标识CA签名的,因此CA用于生成数字证书的签名函数一定要以自己的私钥作为一个输入参数。在RSA加密 系统中,发送端的解密函数就是一个以私钥作 为参数的函数,因此常常被用作签名函数使用。签名算法是与证书一并发送给接收 端的,比如apple的一个服务的证书中关于签名算法的描述是“带 RSA 加密的 SHA-256 ( 1.2.840.113549.1.1.11 )”。因此CA用私钥解密函数作为F,对C的摘要进行运算得到了客户数字证书的签名,好比大学毕业证上的校长签名,所有毕业证
李海彬
2018/03/23
1.3K0
数字证书原理
在传统的加密算法中,通信的双方会采用一个共享秘钥来对数据进行加密和解密。消息发送方先采用秘钥对明文进行加密然后再进行传送,待接收方收到消息后,再采用秘钥对密文进行界面,以得到明文。由于加密和解密采用的秘钥是相同的,这种加密算法也称为对称加密。采用对称加密的通信过程如下图所示:
赵化冰
2022/08/01
2.7K1
数字证书原理
使用mkcert工具生成受信任的SSL证书,解决局域网本地https访问问题
输入mkcert-v1.4.3-windows-amd64.exe -install 命令 ,安装mkcert。将CA证书加入本地可信CA,使用此命令,就能帮助我们将mkcert使用的根证书加入了本地可信CA中,以后由该CA签发的证书在本地都是可信的。卸载命令 mkcert-v1.4.3-windows-amd64.exe -install
宝耶需努力
2022/12/13
10.7K0
使用mkcert工具生成受信任的SSL证书,解决局域网本地https访问问题
choco 安装 和 mkcert 本地https
原文链接:https://blog.spiritling.cn/posts/4cb12659/
SpiritLing
2020/07/20
1.4K0
choco 安装 和 mkcert 本地https
PKI - 借助Nginx 实现Https_使用CA签发证书
总之,使用 CA 签发证书可以确保通信的安全性、可靠性和完整性,为网络通信提供了重要的保护和信任基础。
小小工匠
2024/05/26
3050
PKI - 借助Nginx 实现Https_使用CA签发证书
CA中心构建及证书签发实录
本实验中,我们将通过开源工具OpenSSL构建一个私有CA中心,并以其为根CA,设立一个子CA机构,并为Client提供证书签署服务。
用户1456517
2019/03/05
1.4K0
CA中心构建及证书签发实录
修复 SSL Certificate Problem,如何定位及解决问题
在开发过程中,使用 curl 进行请求或 git 克隆远程仓库时,可能会经常遇见一些 https 证书相关的错误,我们整理了一些常见的错误以及解决方案的汇总,保持更新,也欢迎你在评论中提供其他更好的方案。
Lone神
2021/11/01
12K0
有关 TLS/SSL 证书的一切
TLS 握手其中关键的一步,就是 Server 端要向 Client 端证明自己的身份。感觉有关 TLS 的内容,介绍握手的原理的有很多,但是介绍证书的并不多,证书是 TLS/SSL 非常关键的一环。本文就尝试说明,证书是用来干什么的,Google 是如何防止别人冒充 Google 的,证书为什么会频繁出问题,等等。
公众号: 云原生生态圈
2024/05/06
1.1K0
有关 TLS/SSL 证书的一切
在linux系统下使用 openssl 命令行构建 CA 及证书
我们将设置我们自己的根 CAroot CA,然后使用根 CA 生成一个示例的中级 CA,并使用中级 CA 签发最终用户证书。
用户8989785
2021/09/09
1.7K1
系统安全加密验证签名之Openssl命令
描述:OpenSSL是一个开源项目,它是安全套接字层密码库(Secrue socket layer)和传输层安全(transport layer security,TLS)协议的实现,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议(SSL/TLS工具集),并提供丰富的应用程序供测试或其它目的使用。
全栈工程师修炼指南
2022/09/29
4.5K0
系统安全加密验证签名之Openssl命令
【实践】如何在本地环境用GO实现HTTPS链接?
本篇文章是基于实操,如何在本地环境用GO实现HTTPS链接。原理部分请参考文章《【深度知识】HTTPS协议原理和流程分析》。
辉哥
2019/05/15
2.6K0
【实践】如何在本地环境用GO实现HTTPS链接?
本地站点开启https
本文这里要说的是如何在本地环境搭建 https,至于说有什么用,假如你找到这了, 就说明你已经用到了. Chrome NET::ERR_CERT_COMMON_NAME_INVALID
chuchur
2022/10/25
9790
本地站点开启https
GoLang:你真的了解 HTTPS 吗?
本文来源:腾讯优图实验室 笔者来自腾讯优图实验室,优图实验室专注于图像处理、模式识别、深度学习,在人脸识别、图像识别、医疗AI、交通、OCR 等领域积累了领先的技术水平和完整的解决方案。近年来,优图在计算机视觉领域的研究和应用积累了深厚的底蕴和丰富的行业落地经验。笔者所在的团队主要负责视觉AI能力赋能边缘计算设备的研发工作。一直以来,在实验室甚至整个公司特别强调“安全和隐私”,近半年,笔者在用 GoLang 开发智能边缘计算设备的网络通信项目时,常被要求务必重视“通信的安全和隐私”。期间,对接了多
腾讯技术工程官方号
2020/02/25
1.3K0
GoLang:你真的了解 HTTPS 吗?
OpenSSL 是什么?
对称加密算法在加密和解密时,使用同一密钥。非对称加密算法需要两个密钥,即公开密钥和私有密钥,公开密钥和私有密钥是一对。用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;用私有密钥对数据进行加密,只有用对应的公开密钥才能解密。因为加密和解密使用两个不同的密钥,所以这类算法叫非对称加密算法。
小阑本阑
2023/06/08
1K0
OpenSSL 是什么?
golang源码分析:http代理和https代理
首先还是上代码:https://github.com/xiazemin/dns_proxy,然后我们思考几个问题:我们使用charles抓包的时候使用的是https代理还是http代理?使用charles代理的时候为什么要装charles的证书,有什么作用?http代理能代理https的请求么?
golangLeetcode
2022/12/17
5610
如何使用SSL证书
SSL证书是用于在WEB服务器与浏览器以及客户端之间建立加密链接的加密技术,通过配置和应用SSL证书来启用HTTPS协议,来保护互联网数据传输的安全,全球每天有数以亿计的网站都是通过HTTPS来确保数据安全,保护用户隐私。
用户8418197
2021/09/05
3.8K0
jks 证书文件的生成步骤
作为文件形式存在的证书,一般有三类: A. 包含有私钥的证书,包含了公钥和私钥,用pkcs12标准,而一般以pfx 作为扩展名; B. DER 编码证书,不含私钥,以cer 结尾,文件是二进制data. 通常CA(无论是intermediate CA还是root CA)证书都是这类; C. BASE64编码的证书,这类证书也不含私钥,一般也以cer结尾,是pem证书, 这类证书可以直接cat 出结果, 特征是”-----BEGIN CERTIFICATE----- “开头,“-----END CERTIFICATE-----”结尾;
qsjs
2022/09/09
6.3K0
用openssl添加https访问并设置客户端信任
x.509 是密码学里面的公钥证书的格式标准. 就是说x.509是一种证书的格式,其实我们经常用这种格式的证书,只是可能没怎么注意过证书格式的标准而已.
qsjs
2020/07/07
3.2K0
相关推荐
Akka-CQRS(13)- SSL/TLS for gRPC and HTTPS:自签名证书产生和使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验