Java 线程池的submit的使用与分析.md

2023-11-15

在Java5以后,通过Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还能使用线程池的特性。上一篇我们介绍了线程池的基本用法和特性。我们用的最多的是ExecutorService的execute方法,它帮我们把线程任务交给线程池,剩下就不管了,也不关心返回值。那么如果我们向把任务交给线程池处理,同时又期望得到结果,这时候怎么做呢?

0.异步返回值的场景

我们先不用线程池,来实现一个功能。加入周末了,几个小伙伴要一块做饭,假设做饭需要3个步骤,分别是:
1.打扫厨房卫生,准备厨具
2.买菜
3.炒菜

现在我们怎么分工呢,现实中一般是这样的,一部分小伙伴去买菜,一部分小伙伴打扫准备厨具,等这两样都做完之后才炒菜。也就是说第1步和第2步是同时进行的。
我们使用Java代码来实现下:

public class Cook{
 public static void futureCook() throws ExecutionException, InterruptedException {
        Callable<Food> first = new Callable<Food>() {
            @Override
            public Food call() throws Exception {
                //do something
                return new Food();
            }

        };
        FutureTask<Food> task1 = new FutureTask<Food>(first);
        new Thread(task1).start();//先去做第一步

        Object task2 = null;
       //.... 第二步做了一些事

        // 第三步 需要用到第一步和第二部的结果
        if (!task1.isDone()) { // 第一步是否完成
            System.out.println("task1 is done");
        }
        Food foods = task1.get();//获取第一步的结果

        cook(foods, task2);

    }
    private static void cook(Food foods, Object task2) {
    }
    static class Food{
        Object food;
    }
}

我们先用一个线程去买菜,执行第一步,同时执行第二步,第二步完成之后,我们试图获取第一步的结果,如果第一步没有执行完,那么就阻塞在这里等待,直到完成。前两步完成之后,我们就可以愉快的做饭了。

下面我们分析下使用到的技术

1.Callable

Callable是一个接口,它只有一个方法call,调用call可以异步执行,并返回结果。

public interface Callable<V> {
    /**
     * Computes a result, o
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 线程池的submit的使用与分析.md 的相关文章

随机推荐

  • Android Menu详解

    菜单的分类 菜单是Android应用中非常重要且常见的组成部分 主要可以分为三类 选项菜单 上下文菜单 上下文操作模式以及弹出菜单 它们的主要区别如下 1 选项菜单是一个应用的主菜单项 用于放置对应用产生全局影响的操作 如搜索 设置 2 上
  • 随机采样方法整理与讲解(MCMC、Gibbs Sampling等)

    本文是对参考资料中多篇关于sampling的内容进行总结 搬运 方便以后自己翻阅 其实参考资料中的资料写的比我好 大家可以看一下 好东西多分享 PRML的第11章也是sampling 有时间后面写到PRML的笔记中去 背景 随机模拟也可以叫
  • 解决VS Code集成终端中Node命令不可用的问题

    问题 VS Code集成终端中输入node v提示 node 不是内部命令 解决方法 1 右键点击VS Code启动图标 选择属性 2 点击兼容性选项卡 3 勾选以管理员身份运行 4 打开VS Code集成终端 输入node v 成功
  • html5 js获取设备信息,js怎么获取电脑硬件信息

    想知道怎么获取电脑的硬件信息吗 下面是学习啦小编带来js怎么获取电脑硬件信息的内容 欢迎阅读 js怎么获取电脑硬件信息 1 写一个js获取userAgent属性的html文件 文件内容如下 alert window navigator us
  • Golang Map原理(底层结构、查找/新增/删除、扩缩容)

    参考 解剖Go语言map底层实现 Go语言核心手册 3 字典 一 Go Map底层结构 Go map的底层实现是一个哈希表 数组 链表 使用拉链法消除哈希冲突 因此实现map的过程实际上就是实现哈希表的过程 先来看下go map底层的具体结
  • SVN账号密码查找

    1 根据路径找到svn simple C Users Administrator AppData Roaming Subversion auth svn simple 2 执行 TSvnPwd exe 查看用户名 密码
  • Related work怎么写?

    傍晚找师兄改论文的related work 师兄一边改related work 一边教我如何写related work 小白鼠记录师兄的related work写作宝典如下 Related work精神 related work不需要写得特
  • 从键盘输入字符串,判断是否为回文字符串。 回文字符串:如果一个字符串,从前向后读和从后向前读,都是一个字符串,则称为回文串,比如adminnimda,dad,mommom。 源程序:

    package Experiment Java test14 import java util Scanner public class test04 public static void main String args Scanner
  • 嵌入式开发概述(树莓派介绍)

    目录 嵌入式定义 嵌入式芯片选型 ARM架构 ARM树莓派 嵌入式定义 国内普遍认同的嵌入式系统的定义是以应用为中心 以计算机技术为基础 软硬件可裁剪 适应应用系统对功耗 可靠性 成本 体积 功耗等严格要求的专用计算机系统 嵌入式系统是软件
  • WPF Virtualization

    WPF虚拟化技术分为UI 虚拟化和数据虚拟化 第一种方法被称为 UI 虚拟化 支持虚拟化用户界面的控件是足够聪明来创建只显示的是实际在屏幕上可见的数据项目所需的 UI 元素 例如 假设我们有一个滚动的列表框是绑定到 1 000 000 项目
  • 微信小程序上线流程

    1 打开微信公众平台扫码登录 2 点击成员管理 我是接的别人开发的版本 首先要管理员给我权限 让我成为小程序的开发者 按下图就可以添加成员了 你要是开发者直接要他给你全勾上 最后点击确认添加就行 3 点击微信开发者工具里的上传按钮或者hbu
  • C++项目实战-实际应用

    目录 典型IO的两个阶段 网络IO Linux上的五种IO模型 1 阻塞 blocking 2 非阻塞 3 IO复用 4 信号驱动 5 异步 Web Server HTTP协议 应用层的协议 简介 概述 工作原理 HTTP 请求报文格式 H
  • 秒传的原理

    在本文中 我们将介绍网盘秒传的基本原理和实现方法 以及秒传的优缺点和应用场景 网盘秒传的基本原理 网盘秒传的基本原理是利用哈希算法 如MD5或SHA 1 对文件进行特征值提取 然后与服务器上已有的文件特征值进行比对 如果发现相同的特征值 就
  • C语言实现贪吃蛇小游戏

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 贪吃蛇实现的结构和方式 2 对窗口进行设置 3 对蛇进行初始化 一 源代码 利用学会的知识做点小游戏 前言 控制台的欢乐就是这么简单 提示 以下是本篇文章
  • Vue3 Table 性能优化,减少 85% 渲染耗时

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 原文链接 https juejin cn post 7194516447932973112 作者 dev zuo 前段时间公司有一个比较
  • 一个新的开始(非技术贴)

    谈谈一个新的开始 说实话 从来没想过自己会有一刻坐在这里写博客 因为一直以来都觉得自己会像父母所期望的那样考上公务员 结婚生子 过平凡的一生 从大一以来 自己都一直坚信这样对我来说是最最好的 但今年大三 用了短短一个月我就改变了想法 可以说
  • 38.驱动调试——printk

    printk的用法 mz linux ChinaUnix博客 printk函数的用法 wwwlyj123321的博客 CSDN博客 printk 34 Linux printk分析 使用 FILE FUNCTION LINE 调试 诺谦 博
  • freemarker---数字小数点格式化问题

    保留小数的问题问题 http blog sina com cn s blog 7db125620101codn html http blog 163 com sir 876 blog static 117052232012102854524
  • SIM800C模块AT指令编程指南

    SIM800C是一款四频GSM GPRS模块 为城堡孔封装 其性能稳定 外观小巧 能满足客户的多种需求 SIM80C工作频率为GSM GPRS850 900 180 190OMHz 可以低功耗实现语音 SMS和数据信息的传输 SIM800C
  • Java 线程池的submit的使用与分析.md

    在Java5以后 通过Executor来启动线程比用Thread的start 更好 在新特征中 可以很容易控制线程的启动 执行和关闭过程 还能使用线程池的特性 上一篇我们介绍了线程池的基本用法和特性 我们用的最多的是ExecutorServ