Callable接口

article/2025/4/28 19:34:54

文章目录

  • Callable概述
  • Future 接口
  • FutureTask
  • 使用 Callable 和 Future
  • 小结(重点)

Callable概述

目前我们学习了有两种创建线程的方法-一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程。但是,Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们无法使线程返回结果。为了支持此功能,Java 中提供了 Callable 接口。
在这里插入图片描述
现在我们学习的是创建线程的第三种方案—Callable 接口

编写如下代码,发现报错。

//比较两个接口
//实现Runnable接口
class MyThread1 implements Runnable {@Overridepublic void run() {}
}//实现Callable接口
class MyThread2 implements Callable {@Overridepublic Integer call() throws Exception {return 200;}
}public class Demo1 {public static void main(String[] args) throws ExecutionException, InterruptedException {//Runnable接口创建线程new Thread(new MyThread1(),"AA").start();//Callable接口,报错new Thread(new MyThread2(),"BB").start();

Callable 接口的特点如下(重点)

1,为了实现 Runnable,需要实现不返回任何内容的 run()方法,而对于Callable,需要实现在完成时返回结果的 call()方法。
2,call()方法可以引发异常,而 run()则不能。
3,为实现 Callable 而必须重写 call 方法
4,不能直接替换 runnable,因为 Thread 类的构造方法根本没有 Callable

在这里插入图片描述

lucy 想去认识 mary 想找一个中间人,这个中间人必须两个都认识,找到了jack

好比Java中,一个类可以实现多个接口,我们要找一个,既可以与Runnable有关系,又可以和Callable有关系。

Future 接口

当 call()方法完成时,结果必须存储在主线程已知的对象中,以便主线程可以知道该线程返回的结果。为此,可以使用 Future 对象。

将 Future 视为保存结果的对象–它可能暂时不保存结果,但将来会保存(一旦Callable 返回)。Future 基本上是主线程可以跟踪进度以及其他线程的结果的一种方式。要实现此接口,必须重写 5 种方法,这里列出了重要的方法,如下:

public boolean cancel(boolean mayInterrupt):用于停止任务。

如果尚未启动,它将停止任务。如果已启动,则仅在 mayInterrupt 为 true时才会中断任务。

public Object get()抛出 InterruptedException,ExecutionException:
用于获取任务的结果。

如果任务完成,它将立即返回结果,否则将等待任务完成,然后返回结果。

public boolean isDone():如果任务完成,则返回 true,否则返回 false

可以看到 Callable 和 Future 做两件事-Callable 与 Runnable 类似,因为它封装了要在另一个线程上运行的任务,而 Future 用于存储从另一个线程获得的结果。实际上,future 也可以与 Runnable 一起使用。要创建线程,需要 Runnable。为了获得结果,需要 future。

FutureTask

Java 库具有具体的 FutureTask 类型,该类型实现 Runnable 和 Future,并方便地将两种功能组合在一起。 可以通过为其构造函数提供 Callable 来创建FutureTask。然后,将 FutureTask 对象提供给 Thread 的构造函数以创建Thread 对象。因此,间接地使用 Callable 创建线程。

核心原理:(重点)

在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给 Future 对象在后台完成

1,当主线程将来需要时,就可以通过 Future 对象获得后台作业的计算结果或者执行状态。
2,一般 FutureTask 多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
3,仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。
4,一旦计算完成,就不能再重新开始或取消计算。
5,get 方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。
6,get 只计算一次,因此 get 方法放到最后。

demo 案例

使用 Callable 和 Future

//比较两个接口
//实现Runnable接口
class MyThread1 implements Runnable {@Overridepublic void run() {}
}//实现Callable接口
class MyThread2 implements Callable {@Overridepublic Integer call() throws Exception {System.out.println(Thread.currentThread().getName()+" come in callable");return 200;}
}public class Demo1 {public static void main(String[] args) throws ExecutionException, InterruptedException {//Runnable接口创建线程new Thread(new MyThread1(),"AA").start();//Callable接口,报错// new Thread(new MyThread2(),"BB").start();//FutureTaskFutureTask<Integer> futureTask1 = new FutureTask<>(new MyThread2());//lam表达式FutureTask<Integer> futureTask2 = new FutureTask<>(()->{System.out.println(Thread.currentThread().getName()+" come in callable");return 1024;});//创建一个线程new Thread(futureTask2,"lucy").start();new Thread(futureTask1,"mary").start();//        while(!futureTask2.isDone()) {
//            System.out.println("wait.....");
//        }//调用FutureTask的get方法System.out.println(futureTask2.get());System.out.println(futureTask1.get());System.out.println(Thread.currentThread().getName()+" come over");//FutureTask原理  未来任务/*** 1、老师上课,口渴了,去买票不合适,讲课线程继续。*   单开启线程找班上班长帮我买水,把水买回来,需要时候直接get** 2、4个同学, 1同学 1+2...5   ,  2同学 10+11+12....50, 3同学 60+61+62,  4同学 100+200*      第2个同学计算量比较大,*     FutureTask单开启线程给2同学计算,先汇总 1 3 4 ,最后等2同学计算位完成,统一汇总** 3、考试,做会做的题目,最后看不会做的题目** 汇总一次**/}
}

控制台:

在这里插入图片描述

小结(重点)

1,在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给 Future 对象在后台完成, 当主线程将来需要时,就可以通过 Future对象获得后台作业的计算结果或者执行状态。
2,一般 FutureTask 多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
3,仅在计算完成时才能检索结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。get 方法而获取结果只有在计算完成时获取,否则会一直阻塞直到任务转入完成状态,然后会返回结果或者抛出异常。
4,只计算一次。


http://chatgpt.dhexx.cn/article/NNG51epr.shtml

相关文章

webshell管理工具之中国蚁剑

实验环境物理机即可 实验工具&#xff1a;中国蚁剑&#xff0c;phpstudy,dvwa网站 一&#xff1a;打开phpstudy开启apache和mysql 1&#xff1a;将dvwa网站放到www目录下 2&#xff1a;用浏览器进行访问 3&#xff1a;登录dvwa网站进行低等级下的文件上传 4&#xff1a;编写…

WebSell管理工具--中国蚁剑安装教程以及初始化

简介&#xff1a;中国蚁剑是一款开源的跨平台WebShell网站管理工具 蚁剑的下载安装&#xff1a; GitHub项目地址&#xff1a;https://github.com/AntSwordProject/ Windows下载安装&#xff1a; 百度网盘下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1A5wK…

15 一句话代码 中国蚁剑 中国蚁剑

title 文章目录 前言一、一句话代码 webshell php.php post 注入 二、中国蚁剑 &#xff08;需要下载两个 1&#xff1a;软件 2&#xff1a;解释器&#xff09;三、Burp &#xff08;burp_suite_pro_v2021.8.2&#xff09;4.更新的话 前言 提示&#xff1a; 123 一、一句话代…

VMware之kali安装中国蚁剑

简介 中国蚁剑是一款开源的跨平台网站管理工具&#xff0c;它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。是一款非常优秀的webshell管理工具,其核心是当年的中国菜刀。中国蚁剑推崇模块化的开发思想&#xff0c;遵循开源&#xff0c;其主要核心功能主…

蚁剑连接php3,利用中国蚁剑无文件连接 phpstudy 后门方法

利用中国蚁剑无文件连接 phpstudy 后门方法 0x01 描述 Phpstudy 是一款 PHP 调试环境的程序集成包, 集成了最新的 Apache,PHP,phpMyAdmin,ZendOptimizer 等多款软件一次性安装, 无需配置, 即装即用. 由于其免费且方便的特性, 在国内有着近百万的 PHP 语言学习者, 开发者用户. 后…

WebShell --中国蚁剑,黑客之剑

文章目录 一、介绍1.1 简介1.2 编码/解码器 二、下载安装三、使用3.1 管理Webshell3.2 自定义UA3.2.1 UA更改 方法一3.2.2 UA更改 方法二 声明&#xff1a;请于合法授权环境下进行使用&#xff0c;请勿用于非法操作&#xff01; 一、介绍 1.1 简介 开源、跨平台网站管理工具&a…

蚁剑连接php3,中国蚁剑antSword RCE漏洞,建议所有用户升级

4月12日凌晨,有用户在中国蚁剑GitHub上提交了issue,称发现中国蚁剑存在XSS漏洞,借此可引起RCE。据悉,该漏洞是因为在webshell远程连接失败时,中国蚁剑会返回错误信息,但因为使用的是html解析,导致xss漏洞。 当通过中国蚁剑连接webshell,出现连接失败情况时,中国蚁剑会…

【简单工具】中国蚁剑V2.0下载安装到上手

目录 1 安装及设置1.1 下载1.2 安装1.3 相关设置 2 第一个Shell2.1 实验环境2.2 实验步骤2.3 思考 3 总结参考文献 1 安装及设置 1.1 下载 下载蚁剑加载器。在蚁剑官方github下载&#xff0c;网址为https://github.com/AntSwordProject/AntSword-Loader&#xff0c;根据自己系…

中国蚁剑的下载以及安装教程

一&#xff0c;中国蚁剑下载 唯一官方github下载地址&#xff1a; AntSwordProject GitHub 加载器&#xff1a; GitHub - AntSwordProject/AntSword-Loader: AntSword 加载器 核心源码&#xff1a; GitHub - AntSwordProject/antSword: 中国蚁剑是一款跨平台的开源网站管…

攻防兼备:中国蚁剑使用指南及特征流量

中国蚁剑是菜刀的升级版本&#xff0c;线现下主流的Webshell连接工具之一&#xff0c;有着较广泛的使用&#xff0c;本篇文章会教给大家蚁剑的使用方法以及不同加密方式的流量特征&#xff0c;兼顾攻防两端。 蚁剑下载安装参考&#xff1a;中国蚁剑(antSword)下载、安装、使用…

中国蚁剑下载安装教程

启动中国蚁剑 1 、 下载主程序 文件名&#xff1a;antSword.zip 链接&#xff1a; https://pan.baidu.com/s/1wRmj_cB1sLkJ_npRCYO8Xw 提取码&#xff1a;8888 下载以后解压&#xff0c;比如放在 E:\dev_runApp\security\antsword\antSword-master 如下图所示&#xff1a; …

中国蚁剑下载和安装

既然都听说过中国蚁剑&#xff0c;就不夸啦~~ 下载地址 AntSwordProject GitHub 如果gitup进不去&#xff0c;附上百度网盘连接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/163nL2VXFNQsBmzrpWVcNXQ?pwd6666 提取码&#xff1a;6666 解压后就可以直接打开 运行后…

中国蚁剑 配置使用

1.编写一句话木马&#xff0c;并命名为muma.php 2&#xff0e;利用靶机的文件上传漏洞&#xff0c;将此木马文件&#xff08; Webshell )上传至靶机 1&#xff09;打开dvwa网站 2&#xff09;成功登录DVWA网站后&#xff0c;在网站主页左侧菜单选择 DVWA Security&#xff0c;…

中国蚁剑运用

访问之前创建的dvwa靶场 更改安全等级为low并且提交 写一句话马 <?php eval($_POST[cmd]); ?> 生成文件名为shell.php 上传此文件 显示成功 获得上传路径 打开中国蚁剑 右键空白处选择添加数据 URL地址为之前获得的路径地址 连接密码输入写的shell.php中内容cm…

中国蚁剑(AntSword)安装

安装 首先&#xff0c;蚁剑分为两个部分&#xff0c;一个是核心源码&#xff0c;另一个是加载器&#xff0c;所以我们需要下载源码和加载器 源码&#xff1a;https://github.com/AntSwordProject/antSword/releases/tag/2.1.14加载器&#xff1a;https://github.com/AntSword…

中国蚁剑安装

中国蚁剑安装 一、下载中国蚁剑安装包 1、下载地址&#xff1a; https://github.com/AntSwordProject/ https://github.com/AntSwordProject/AntSword-Loader2、选择版本 二、kali系统下安装步骤 一、上传你所下载的linux 版本的中国蚁剑 1、打开kali终端 找到你上传的中…

中国蚁剑流量分析

中国蚁剑流量分析 文章目录 中国蚁剑流量分析1.代理2.测试连接数据包:执行代码:执行结果: 3.双击连接第一个数据包数据包: 第二个数据包数据包:执行代码:response: 4.打开文件夹数据包: 5.打开文件数据包&#xff1a;执行代码&#xff1a; 6.修改文件1.修改小文件数据包&#x…

中国蚁剑Low

第1步 在DVWA Security里将等级改为Low再点击Submit 第2步在设置里的Advanced的Network的Settings里改为第4个再点击OK 第3步打开抓包工具 第4步到File Upload里 第5步选择文件 第6步点击Upload进行抓包 第7步找到jpg文件将.jpg改为.php 第8步到中国蚁剑里添加数据 第9步目标i…

中国蚁剑安装教程

中国蚁剑&#xff1a; 向中国菜刀致敬&#xff01;中国蚁剑&#xff1a;一款跨平台的开源网站管理工具 github地址&#xff1a; 蚁剑源代码 https://github.com/AntSwordProject 蚁剑加载器 https://github.com/AntSwordProject/AntSword-Loader 云盘下载&#xff1a; h…

中国蚁剑简介

1简单介绍 中国蚁剑和中国菜刀类似&#xff0c;是一款webshell终端管理工具&#xff0c;主要面向合法授权的渗透测试安全人员及常规操作的管理员。 一般结合一句话木马和文件上传使用 一句话木马&#xff1a;在很多的渗透过程中&#xff0c;渗透人员会上传一句话木马&#x…