切记【阻塞/非阻塞】【FutureTask异步执行】

简介: 切记【阻塞/非阻塞】【FutureTask异步执行】

一、阻塞非阻塞


1.1 同步阻塞IO


在Java应用中,默认情况下所有的Socket连接的IO都是同步阻塞的

例如在java发起的一个socket的read操作大致流程如下:

1.Java启动io的read读操作开始,用户线程就进入阻塞状态

2.系统接收到read调用,开始准备数据,如果内核数据没有准备好,则内核进行等待。

3.内核一直等待完整的数据到达,就会将数据从内核缓冲区复制到用户缓冲区,返回内核结果.

4.内核返会结果后,用户线程才会解除阻塞的状态,重新运行。

特点:在内核执行IO两个点阶段,用户线程都被阻塞了。

优点:开发程序简单,阻塞期间,用户线程不占用CPU。

缺点:每个连接配备独立的线程,高并发场景下,需要大量的线程维护网络连接,内存,线程切换开销会非常大。


1.2 同步非阻塞NIO


1.内核中没有数据,系统会直接返回调用失败的结果,用户线程需要不断地发起IO调用。

2.内核中有数据,发生阻塞,知道数据从内核中复制到用户线程中,复制完成后,系统调用返回成功,解除阻塞状态,用户空间进行处理。

特点:用户线程需要不断的轮询IO系统调用,轮询数据是否已经准备好。

优点:每次发起IO调用,可以立马反悔一个结果,用户线程不会阻塞,实时性较好。

缺点:不断轮询,占用CPU,效率低下。


二、同步、异步


同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。

异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而,异步方法通常会在另外一个线程中,“真实”地执行着。整个过程,不会阻碍调用者的工作.


三、FutureTask结合Callable接口创建线程【异步】


Future是JDK用于处理多线程环境下异步问题的一种模式,FutureTask就是Future的一种实现。

他最大的好处就是:客户端发出请求后,可以立马得到一个返回结果,而不用一直等待这服务器来处理。

在Callable接口中,call()方法有一个类型的泛型返回值,返回值可以是任意类型,就可以通过FutureTask的get()方法来接受返回值。get方法是一个闭锁式的阻塞方法,此方法会一直等待,知道call方法执行完毕return返回值为止。


例如:Callable创建线程计算 1-100之和并返回个Main线程的sum变量:


public class CallableTest {
    public static void main(String[] args) {
        MyCallableThread thread = new MyCallableThread();
        FutureTask<Integer> task = new FutureTask<>(thread);
        new Thread(task).start();
        try {
            Integer sum = task.get();
            System.out.println(sum);
        }catch (Exception e){
        }
    }
}
class MyCallableThread implements Callable<Integer>{
    @Override
    public Integer call() throws Exception {
        System.out.println("线程开始计算 1 + ... +100");
        int sum = 0;
        for (int i = 1; i <=100; i++) {
            sum =sum + i;
        }
        return sum;
    }
}


目录
相关文章
|
存储 移动开发 开发框架
使用UniApp实现视频数组自动下载与播放功能:一步步指导
使用UniApp实现视频数组自动下载与播放功能:一步步指导
541 0
|
JavaScript
Vue使用Element的表格Table显示树形数据,多选框全选无法选中全部节点
Vue使用Element的表格Table显示树形数据,多选框全选无法选中全部节点
729 0
|
JavaScript API 开发者
使用 u-navbar 组件实现页面导航和布局的完全指南
使用 u-navbar 组件实现页面导航和布局的完全指南
2172 0
|
9月前
|
编解码 开发框架 搜索推荐
《ArkUI框架:构建原生应用界面的效率革新引擎》
ArkUI是鸿蒙系统原生UI开发框架,采用简洁直观的声明式语法(基于ArkTS语言),极大提升开发效率。它内置丰富多样的UI组件库,支持一站式界面搭建;提供高效的布局系统,轻松应对多设备适配挑战;具备强大的动画与交互能力,助力打造沉浸式体验。同时,实时预览与调试工具加速开发迭代,与HarmonyOS深度融合,充分发挥分布式优势。ArkUI为开发者带来全方位效率提升,推动鸿蒙生态发展,引领UI开发新潮流。
416 0
|
10月前
|
存储 人工智能 搜索推荐
HealthGPT:你的AI医疗助手上线了:支持X光到病理切片,诊断建议+报告生成全自动
HealthGPT 是浙江大学联合阿里巴巴等机构开发的先进医学视觉语言模型,具备医学图像分析、诊断辅助和个性化治疗方案建议等功能。
1284 5
HealthGPT:你的AI医疗助手上线了:支持X光到病理切片,诊断建议+报告生成全自动
uniapp滑动到一定的高度后固定某个元素到顶部效果demo(整理)
uniapp滑动到一定的高度后固定某个元素到顶部效果demo(整理)
|
Ubuntu Docker 容器
在Docker中,如何实现退出容器时候自动删除?
在Docker中,如何实现退出容器时候自动删除?
|
监控 Linux 编译器
Linux C++ 定时器任务接口深度解析: 从理论到实践
Linux C++ 定时器任务接口深度解析: 从理论到实践
479 2
|
XML 存储 文件存储
LabVIEW使用自定义模板和示例项目来开发LabVIEW项目
LabVIEW使用自定义模板和示例项目来开发LabVIEW项目
204 0
|
安全 网络安全 开发工具
对象存储oss使用问题之flutter使用http库进行post请求文件上传返回400如何解决
《对象存储OSS操作报错合集》精选了用户在使用阿里云对象存储服务(OSS)过程中出现的各种常见及疑难报错情况,包括但不限于权限问题、上传下载异常、Bucket配置错误、网络连接问题、跨域资源共享(CORS)设定错误、数据一致性问题以及API调用失败等场景。为用户降低故障排查时间,确保OSS服务的稳定运行与高效利用。
892 1