Callable 接口

article/2025/4/29 16:15:17

Callable 接口 是 java.util.concurrent.下的一个泛型接口 , 只有一个call () 方法 , 它是有返回值的 ,  我们可以获取多线程执行的结果 , 使用 Callable接口 和 FutureTask 的组合 , 可以实现利用 FutureTask 来跟踪异步计算的结果 

 

获取多线程的方式


1. 继承 Thread 类

2. 实现 Runnable 接口

3. 使用 Callable 接口   ( FutureTask + Callable )

 

Runnable 接口 和 Callable 接口的区别 ?

1. Runnable 接口 没有返回值 , Callable 接口有返回值

2. Runnable 接口 有抛异常 , Callable 接口没有抛异常

3. Runnable 接口 的方法是 run ( ) , Callable 接口的 方法是 call ( )

特别重要的一个区别 :  Callable 实现了 使用 FutureTask 异步计算的操作 , 就是 可以检测方法是否完成 , 以及计算的结果值 , 可以根据 Future 对象 了解线程在执行任务中的情况

 

Callable 接口直接替换 Runnable 是否可行 ?

不可行 ! ! !

因为 : thread 类的构造方法中根本就没有 Callable 这个类型的参数 ,  这时我们无法直接使用 Callable 来实现多线程的

 

这时我们需要找一个媒介, 一个中间人 : 利用了 java 多态 ,一个类可以实现多个接口 !!

这个中间人就叫 : FutureTask

 

如何使用 callable接口 实现多线程 操作 资源类 的流程以及思想

1. 我们无法直接传入一个 callable 的接口类型 , 这时需要找到一个中间人 , 将他们联系起来

2. 我们知道 Thread 类中可以传入一个 Runnable 接口 , 所以根据这个就可以传入 Runnable的实现子类或者是Runnable 的一些子接口 , 可以发现它有一个叫做 RunnableFuture 子接口,这个子接口还有一个实现子类 叫做 FutureTask (中间人)

3. 这个 FutureTask类 , 他有一个构造方法 , FutureTask (Callable<V> callable) , 这时我们可以发现 , 它能够传入一个 Callable 接口类型的

4. 这时就连接上了 , 我在 Thread 中传入一个 futureTask (相当于 Runnable 的孙子)

5. Thread 就间接性的 达成了通过使用 Callable 接口 + FutureTask 来实现多线程操作资源类

根据以上代码,可以看到两个类如果想要产生关联 , 可以使用这样的思想 :

1. 继承或者实现了某些类或者某些接口 ,

2. 可以在一个类中引入/声明另外一个类的实例

3. 构造注入 , 一个类的构造器中 , 可以传入另一个类的实例

public class CASTest666 {private int ticket = 50;private int i = 1;public synchronized void sale() {if (ticket > 0) {System.out.println(Thread.currentThread().getName() + "再卖第" + "\t" + i++ + "张票还有" + --ticket + "\t" + "张票");}}
}class TestMythread {public static void main(String[] args) throws ExecutionException, InterruptedException {CASTest666 casTest666 = new CASTest666();FutureTask futureTask = new FutureTask<>(new Callable<Object>() {@Overridepublic String call() throws Exception {for (int i = 0; i < 50; i++) {casTest666.sale();}return "我是callable实现的多线程的操作";}});Thread thread = new Thread(futureTask, "A");thread.start();// 运行成功后获得返回值:调用get方法System.out.println(futureTask.get());}
}

运行成功后还可以获取返回值 , 调用 get 方法

 

那么 , FutureTask 是什么 ?


FutureTask 见名知意 : " 未来的任务 " , 就是使用它就处理一件比较复杂的事情 , 异步调用 , 在不影响主线程的正常执行的前提下 , 另启一条线程去做某些复杂耗时的事情 , 最后处理完成后在和主线程汇总

打个比方 :

就像老师上着课,口渴了, 想喝水,老师如果去买水, 没有老师了, 同学就要等待老师回来 , 此时无法上课 , 出现了阻塞 , 不太合适,那么怎么办 ? 我可以单起一个线程 , 例如 : 找班长 (FutureTask) 帮忙买水 ,老师 (main) 还能继续讲课 , 就不会发生阻塞的问题 , 水买回来了放桌子上,当老师需要的时候再去拿就可以了(get方法)

FutureTask 的原理


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

注意 : 如果是两个线程 操作同一个资源类时 , FutureTask 的特点就是在高并发环境下确保任务只执行一次 , 我们仅仅只是可以多次的 get 取值

class CallableTest {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask futureTask = new FutureTask(() -> {System.out.println(Thread.currentThread().getName() + "Callable1 我来咯");TimeUnit.SECONDS.sleep(4);return 1024;});FutureTask<Integer> futureTask2 = new FutureTask(() -> {System.out.println(Thread.currentThread().getName() + "  Callable2 我来咯");TimeUnit.SECONDS.sleep(4);return 2048;});//        两个线程通过实现Callable接口的方式来操作不同的资源类new Thread(futureTask, "线程1").start();   // 线程1 Callable1 我来咯new Thread(futureTask2, "线程2").start();  // 线程2 Callable2 我来咯//       注意 get 方法写在了 main 线程的前面, 在计算的时候会发生阻塞 ,知道计算完成 get调用完毕 才会执行main线程
//       一般将 get 方法放到最后,否则会出现阻塞,导致主线程等待计算的过程System.out.println(futureTask.get());   // 1024System.out.println(futureTask2.get());  // 2048System.out.println(Thread.currentThread().getName() + " come over");  // main come over}
}


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

相关文章

Java用Callable接口创建线程

一、概述 使用Callable接口创建线程能够返回数据。与Runnable接口创建线程的方式有点类似&#xff0c;也是需要通过Thread类来创建线程。由于Thread类的构造函数中没有Callable接口&#xff0c;选用了FutureTask类来作为连接创建线程。  FutureTask类实现了RunnableFuture接口…

JUC-多线程(5.获得线程的第三种方式)学习笔记

文章目录 获得线程的第三种方式 &#xff1a; Callable接口 1. 前言1. 获得多线程的方法几种&#xff1f;2. 以下两种获得线程的方式的异同 2. 使用1. 重写 call 方法2.创建线程3.获取返回值 3. 原理1. 简述2. 解释3. 结论 获得线程的第三种方式 &#xff1a; Callable接口 1.…

Callable接口

文章目录 Callable概述Future 接口FutureTask使用 Callable 和 Future小结(重点) Callable概述 目前我们学习了有两种创建线程的方法-一种是通过创建 Thread 类&#xff0c;另一种是通过使用 Runnable 创建线程。但是&#xff0c;Runnable 缺少的一项功能是&#xff0c;当线程…

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…