ExecutorService 与休闲线程 Spawner

2024-04-18

我有一个关于如何的基本问题ExecutorService在 Java 中工作。

很难看出简单创建之间的区别Threads并行执行一些任务并将每个任务分配给ThreadPool.

The ExecutorService使用起来也看起来非常简单和高效,所以我想知道为什么我们不一直使用它。

这只是一种方法比另一种方法执行速度更快的问题吗?

这是两个非常简单的例子来展示两种方式之间的区别:

使用执行器服务:Hello World(任务)

static class HelloTask implements Runnable {
    String msg;

    public HelloTask(String msg) {
        this.msg = msg; 
    }
    public void run() {
        long id = Thread.currentThread().getId();
        System.out.println(msg + " from thread:" + id);
    }
}

使用执行器服务:Hello World(创建执行器,提交)

static class HelloTask {
    public static void main(String[] args) {
        int ntasks = 1000;
        ExecutorService exs = Executors.newFixedThreadPool(4);

        for (int i=0; i<ntasks; i++) { 
            HelloTask t = new HelloTask("Hello from task " + i);    
            exs.submit(t);
        }
        exs.shutdown();
    }
}

下面显示了一个类似的示例,但扩展了 Callable 接口,您能告诉我两者之间的区别以及在哪些情况下应该使用特定的一个而不是另一个?

使用执行器服务:计数器(任务)

static class HelloTaskRet implements Callable<Long> {
    String msg;

    public HelloTaskRet(String msg) {
        this.msg = msg; }

        public Long call() {
        long tid = Thread.currentThread().getId(); 
        System.out.println(msg + " from thread:" + tid); 
        return tid;
    } 
}

使用执行器服务:(创建、提交)

static class HelloTaskRet {
    public static void main(String[] args) {
        int ntasks = 1000;
        ExecutorService exs = Executors.newFixedThreadPool(4);

        Future<Long>[] futures = (Future<Long>[]) new Future[ntasks];

        for (int i=0; i<ntasks; i++) { 
            HelloTaskRet t = new HelloTaskRet("Hello from task " + i);
            futures[i] = exs.submit(t);
        }
        exs.shutdown();
    }
}

虽然问题和示例代码不相关,但我会尝试澄清两者。

优点ExecutorService随机产生线程的原因是它的行为可以预见地并且避免了线程创建的开销,这在JVM上是比较大的(例如需要为每个线程预留内存)。

通过可预测性,我的意思是你可以控制并发线程的数量,并且你知道它们何时以及如何被创建和销毁(这样你的 JVM 就不会在突然达到峰值的情况下崩溃,并且线程也不会被遗弃而泄漏)记忆)。您可以通过ExecutorService实例周围,以便程序的各个部分可以向其提交任务,同时您仍然在一个位置完全透明地管理它。然后您可以替换基于的确切实现,例如关于配置或环境。例如,您可能希望根据可用 CPU 的数量拥有不同数量的池线程。
An ExecutorService也可以精确地scoped,并在退出范围时关闭(通过shutdown()).

A fixedThreadPool使用一个线程池,该线程池的增长不会超出其分配的范围。

A cachedThreadPool没有最大值,但会在一段时间内重用缓存的线程。它主要用于需要频繁并发执行许多小任务的情况。

A singleThreadExecutor用于串行执行的异步任务。

还有其他的,比如newScheduledThreadPool对于周期性重复的任务,newWorkStealingPool用于可以分为子任务和其他一些任务的任务。探索Executors https://docs.oracle.com/en/java/javase/18/docs/api/java.base/java/util/concurrent/Executors.html类的详细信息。

从 JVM 18 开始,虚拟线程已经成为现实,而且创建虚拟线程的成本很低,因此它们显着改变了情况。一个ExecutorService每次创建一个新的虚拟线程可以通过以下方式获得newVirtualThreadPerTaskExecutor。与手动生成线程相比,使用此方法的优点不是以性能为中心,而是以性能为中心。结构性的因为它允许范围界定和上面解释的其他好处,以及与期望的现有 API 的互操作性ExecutorService.

现在,关于Runnable vs Callable,从你的例子中很容易看出。Callables 可以返回一个值占位符(Future)最终将由未来的实际值填充。Runnables 无法返回任何内容。另外,一个Runnable也不能抛出异常,而Callable can.

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

ExecutorService 与休闲线程 Spawner 的相关文章

  • 将 BeanFactory 注入 Bean

    我想注入一个SpringBeanFactory到由同一个创建的 BeanBeanFactory有什么办法可以这样做吗 顺便说一句 我正在开发一个网络应用程序 如果没有 我知道我可以通过以下方式获得 BeanFactoryRequestCon
  • 使用 Ant 运行 JUnit 测试

    我正在尝试运行我的 JUnit 测试用例 但我不断收到错误 Test com capscan accentsWorld FAILED 报告已创建 但测试未运行 这是我的蚂蚁代码
  • Spring Boot 动态重置数据源

    当 Spring 配置文件或自定义数据库属性文件中的数据库名称 密码或主机名等数据库属性发生更改时 我尝试更新 Spring Boot 中的数据源 当属性更改时 应用程序必须通过侦听属性更改来自行更新 一旦数据库配置发生更改 我就使用 Sp
  • playframework 全局设置 @Required 字段的自定义消息

    我正在寻求有关翻译 Play 框架 2 2 中的验证消息的帮助 我有必填字段 FE Required message To pole jest wymagane public String miesiac Required public S
  • 使用 pdfbox 1.8.8 进行视觉签名

    我正在尝试生成带有视觉签名和 pdfbox 的 PDF 我有两个流 似乎 pdfbox 只能处理文件 如果没有三个临时文件 我就无法使其工作 我可以看到从here https github com apache pdfbox blob b7
  • NGINX 与 Tomcat 配置

    我是 Nginx 新手 我需要你的帮助 根据很多论坛我了解到我们所有的静态页面都存储在Nginx中 当有请求到来时 我必须将该请求传递给 tomcat 获取数据 并在 tomcat 生成响应后生成响应 目前 我刚刚做到了 我将请求直接传递给
  • Java 中的额外导入会减慢代码加载时间吗?

    向 Java 代码中添加更多 import 语句是否可能会减慢将类加载到 JVM 中所需的时间 不 导入仅在编译中用于查找类引用 添加未使用的导入 它们不会执行任何操作 换一种方式 import java util 只是意味着你可以写 Ma
  • 运行时签名是什么?

    当涉及到有界类型时 我对 Java 的类型擦除有一些理解上的问题 考虑一下 class Event From the API class FooEvent extends Event abstract class Foo
  • 使用 jaxb 编组时使用派生类

    我有一个具有公共基类的对象列表 我尝试使用 jaxb 将其序列化为 XML 我希望在编组时使用派生类的注释 但我在实现这一点时遇到了麻烦 import java util Arrays import java util List impor
  • 与 Java 7 相比,Java 8 ScriptEngine 的主要性能问题

    我有一个 Java 程序 使用 JDK 7u80 编译 它广泛使用了 JavaScript ScriptEngine JSR 223 我注意到 与 Java 7 运行时环境 JRE 7u80 相比 我的程序在 Java 8 运行时环境 JR
  • 如何使用 DynamicJasper 在 JasperReports 的页脚处显示每列的总和而不进行分组?

    我尝试使用下面的方法 drb addGlobalFooterVariable totalAmount DJCalculation SUM drb addGlobalFooterVariable basicAmount DJCalculati
  • HttpContext 类及其线程安全

    我有一个辛格尔顿应用程序中的对象具有以下属性 private AllocationActionsCollection AllocationActions get return HttpContext Current Session Allo
  • 无法运行正在访问 GlassFish v3 上的 EJB 的应用程序客户端

    环境 GlassFish 3 0 1 NetBeans 6 9 JDK 6u21 Problem 无法运行正在访问 EJB 的应用程序客户端 错误报告可以在下面找到http netbeans org bugzilla show bug cg
  • FileStream.(Begin/End)(Read/Write)的同步要求

    Net 可以接受以下多线程调用模式吗文件流 http msdn microsoft com en us library y0bs3w9t 28v VS 90 29 aspx 多个线程调用这样的方法 ulong offset whatever
  • 高效快速的线程参数方法

    创建带参数的线程最有效的方法是什么 参数是一个结构体 如果该结构体不能保留在父线程堆栈上 有两种解决方案 具有动态内存分配 struct Arg int x int y void my thread void v arg Arg arg A
  • 如何从指纹扫描仪获取输入并保存[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 Android Marshmallow 和 Moto G4 以及一台设备进行测试 我想创建一个应用程序 它将接受指纹输入并
  • 如何在弹性搜索中生成多个布尔查询的查询

    我想使用 spring 框架在 elasticsearch 中动态生成多个布尔运算的查询 我在elasticsearch中的数据就像 masterID
  • SAX:如何获取元素的内容

    我在理解使用 SAX 解析 XML 结构时遇到了一些困难 假设有以下 XML
  • OSGI Felix 容器正在初始化模拟私有字段

    我试图模拟我的类中的一个私有字段 该字段由运行我的应用程序的 OSGI 容器初始化 我放了一个示例代码供参考 请提供任何线索 import org apache felix scr annotations Component name My
  • ORA-02289: 序列不存在,hibernbate 中出错

    ORA 02289 序列不存在 hibernbate 中出错 在 Oracle 中 您无法自动生成值 您应该创建一个序列 我们称之为 VEHICLE SEQ 然后你应该把这个注释放在你的 id 上 GeneratedValue strate

随机推荐

  • msscript.ocx 从哪里安装

    我在我的应用程序中使用 msscript ocx 它是 Windows 的 ActiveX 脚本主机 尽管我希望能够对高度可定制的 XP 嵌入式 XPe 使用相同的功能 1 我想知道在XPe上是否可以选择性安装msscript ocx 2
  • 为什么我的 Android 应用程序(具有 root 权限)无法访问 /dev/input?

    我的应用程序针对已root的Android设备 它具有root权限并且需要访问该目录 dev input 但为什么它会抛出opendir failed Permission denied even dev input已经是chmod to
  • 读取 bash 脚本中 psql 返回的错误

    我需要在从 bash 脚本运行 psql 时检查错误 这是我们如何在脚本中运行的示例 return value psql X POSTGRES CONNECTION STRING f build table sql w b A q t ps
  • jQuery + JSONP + 雅虎查询语言

    我想从外部来源获取实时汇率 所以我找到了这个很棒的网络服务 该服务运行得非常出色 唯一的缺点是它不提供 JSONP 结果 仅提供 XML 因此 在尝试使用 jQuery ajax 使用此 Web 服务时 我们遇到了跨浏览器问题 所以我发现雅
  • 扩展 Mandelbrot 生成 Julia

    在一个项目上工作 要求我使用相同的代码 请注意在同一个文件中生成曼德尔布罗集和朱莉娅集 我有一个工作曼德尔布罗集 但可以看到如何使用相同的代码扩展到朱莉娅集 也许我没有理解之间的区别 谁能详细说明一下 import numpy as np
  • src 和 data-src 属性之间有哪些区别?

    使用两者有何区别和后果 好与坏 data src or src的属性img标签 我可以使用两者获得相同的结果吗 如果是这样 什么时候应该使用它们 属性src and data src没有任何共同点 除了它们都被 HTML5 CR 允许并且它
  • 相机视图上的水印图像偏移

    我创建了一个覆盖图像用作水印 但图像发生了偏移 我已经将代码放在下面 该代码基于 Ivan Karpan 的这篇文章 iPhone 相机视图上的实时水印图像 https stackoverflow com questions 2076456
  • Ruby on Rails:如何将文件呈现为纯文本(没有任何 HTML)

    如何在 Rails 中将文件渲染为纯文本 文本 不渲染任何 HTML 我试过了 render file path to file layout false and render file path to file content type
  • ascx 的视图状态在回发之间丢失

    在我的 ASP NET 应用程序中 我使用 LoadControl 动态加载 ascx 使用以下模式 var ctrl LoadControl path to control ascx ControlType ctrl SomeProper
  • 对象销毁对于加密目的可靠吗?

    作为后续这个问题 https stackoverflow com questions 57515813 我正在想象一个存储敏感数据 例如加密密钥 的类 为了简化事情 假设不涉及继承 struct Credential std array
  • awk 有条件地组合多行

    我想将多行不同长度的值合并到一行 如果它们与 ID 匹配 输入示例是 ID Value a 1 49 a 2 75 b 1 120 b 2 150 b 3 211 c 1 289 d 1 301 d 2 322 所需的输出示例是 ID Va
  • AngularJS 中的 IE11 访问被拒绝

    每个开发管道都有 2 个部分 首先努力工作并开发应用程序 其次要更加努力 让它兼容伟大的IE 我们有一个AngularJS v1 3 13 没有任何服务器端代码开发的应用程序Webstorm 我们在做REST致电服务 我们的应用程序在 Ch
  • 如何访问 json 数据中的嵌套数组

    我想访问leagueTable此数组内JSON数据 缩短的JSON看起来像这样 每个数组并不显示所有数据以保存滚动 如何访问 leagueTable 数组中的值 data fixtures fixtureId 4950418 fixture
  • 如何在linux上设置android SDK进行命令行开发?

    我正在尝试设置 android SDK 在 Linux Ubuntu 9 10 的命令行上开发一个简单的程序 我尝试过 eclipse 但它在 Ubuntu 上运行有问题 所以我放弃了 这是我到目前为止所做的 从下载 android sdk
  • TMP环境变量发生了什么?

    我总是听说在 UNIX 计算机上查找临时文件夹的正确方法是查看 TMP 环境变量 当编写适用于 Windows 和 Linux 的代码时 我会检查 TEMP 和 TMP 今天 我发现我的 Ubuntu 安装根本没有该环境变量 我知道您似乎总
  • SQL SERVER (express) 中的连接池 - 推荐数量?

    对于我使用连接池的每个应用程序 是否有建议的连接量 我的应用程序在 同一 服务器上使用 ASP NET 和 C 来对抗 sql Express 我有 5 个应用程序正在运行 它们没有被频繁使用 所有连接都打开和关闭 所以我正在考虑将每个应用
  • 如何在 JavaScript 中获取 gif 图像的持续时间

    我只尝试显示一次 gif 所以我使用这段代码来实现这一点 var ui img document getElementById ui image ui img hidden false setTimeout function ui img
  • 如何将输入类型时间的值传递给 Date 对象?

    此函数将时间转换为 12 小时格式 感谢 Stack Overflow 上此函数的贡献者 JS function ampm date var hours date getHours var minutes date getMinutes v
  • HTML Purifier 配置中的白名单表单

    我使用 HTML Purifier 来清理 CMS 中的输入 我的许多客户喜欢在他们的网站上有 PayPal 捐赠按钮 但 HTML Purifier 删除了这些表格 我注意到 HTML Purifier 有一个HTMLPurifier H
  • ExecutorService 与休闲线程 Spawner

    我有一个关于如何的基本问题ExecutorService在 Java 中工作 很难看出简单创建之间的区别Threads并行执行一些任务并将每个任务分配给ThreadPool The ExecutorService使用起来也看起来非常简单和高