范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

说一说Java19中的虚拟线程

  #头条创作挑战赛#
  Java 19 即将发布(2022年9月20日)。虽然 Java 19 只是一个非LTS版本,但是其中的虚拟线程(Virtual Threads)和结构化并发(Structured Concurrency)是两个让人非常期待的功能。虚拟线程在 Java 19 虽然是预览功能,但是按照 Java 的发布周期,在下一个 Java LTS 版本 Java 21 中,虚拟线程就会成为正式功能。虚拟线程会为 Java 的并发编程带来颠覆性的影响。
  结构化并发在 Java 19 是孵化功能。要成为正式功能还有很长的一段路要走。结构化并发会在另外的文章中介绍。
  当然了,我知道不少人看到虚拟线程之后,第一反应就是:这不就是协程吗?Go 早就有了,Kotlin 也早就有了;也会有人吐槽说,虚拟线程就这?怎么不支持 ABC,也没有 DEF?比 XXX 语言的差远啦,我还不如继续回去用 XXX 呢。
  其实不止是虚拟线程,Java 之前的一些新特性,被人吐槽的也非常多。Java 的泛型早就不知道被吐槽多少回了。Java 9 的模块系统,当初设想的前景很美好,但是直到现在,采用模块系统的第三方库和应用仍然非常之少。可以预期的是,虚拟线程肯定会让很多 Java 开发人员不满意。不过这是没办法的事情。作为一名 Java 程序员,这就是我们现在可以用的东西。如果它能让你的开发更简单,深入了解一下总没有坏处。
  吐槽结束,言归正传。使用 Java 线程时的常见问题
  作为一名 Java 程序员,在接触到多线程开发时,都会了解到这样一个重要的前提,那就是线程是稀缺资源。这个前提本身并没有什么问题,因为 Java 里面的线程封装了操作系统的线程,而线程由于其自身的开销较大, 总体的数量是存在一个上限的。在这个前提之下,或者说限制之下,Java 的多线程开发会有一些固有的模式:线程通常由线程池来管理。道理也很简单。线程是稀缺资源,创建的开销也大,就得复用。一个任务通常会在多个线程之间不断倒手。在高性能服务器端开发框架中,会有一个使用非阻塞I/O的I/O线程来接收请求。对于耗时较长的任务,这些请求会被转发给工作线程。处理完成之后再把结果通过I/O线程来返回。
  由于这些固有模式,就引申出来一系列的问题,包括但不限于如下这些:Java 线程池的创建和使用。在网上你可以搜索到与线程池相关的一大堆面试八股文。在多个线程之间使用 thread local 来传递上下文对象。对于一个请求,由于整个处理流程涉及多个线程池中的线程,追踪和调试变得非常困难。
  虚拟线程的出现,可以为解决这些问题提供新的思路。虚拟线程概述
  在 Java 19 之前,Java 只有一种类型的线程,Java 19 中称为 平台线程 (platform thread)。平台线程与操作系统的内核线程是一一对应的。与平台线程对应的就是新增的虚拟线程。
  虚拟线程是用户模式线程 ,由 Java 运行时进行调度,而不是由操作系统来调度。虚拟线程和内核线程是 M 对 N 的对应关系,也就是说,  M 个虚拟线程会被映射到 N 个内核线程上 。
  平台线程和虚拟线程都使用 java.lang.Thread 来表示。这就意味为开发人员不需要学习新的 API 来使用虚拟线程。
  一个增加虚拟线程的重要动机是提供一种可扩展的方式来实现使用独占线程处理每个请求(thread-per-request)的并发风格。在编写服务端应用时,最自然的方式是对于每个请求,使用独占的线程来处理该请求,因为请求是相互独立的。这就是 thread-per-request 的并发风格。这种方式易于理解和编程实现,也易于调试和性能调优。
  然而,thread-per-request 风格并不能简单地使用平台线程来实现。在实现上,平台线程是操作系统中线程的封装。操作系统的线程会占用资源,存在数量上限。对于一个要并发处理海量请求的服务器端应用来说,对每个请求都创建一个平台线程是不现实的。
  对于这个问题,很多框架都提供了解决方案。常用的思路是依赖非阻塞 I/O 和异步编程。当某个请求在等待 I/O 操作时,它会暂时让出线程,并在 I/O 操作完成之后继续执行。通过这种方式,可以用少量的线程来同时处理大量的请求。这些框架可以提升系统的吞吐量,但是要求开发人员必须熟悉所使用的底层框架,并按照特定的风格来编写代码。
  在使用虚拟线程之后,开发人员可以使用最自然的方式来编写代码,把请求的处理逻辑全部在一个虚拟线程中完成。在完成对请求的处理之后,相应的线程也会被自动销毁。这极大地降低了编写高并发服务端应用的难度。
  虚拟线程是轻量级的,并不需要放入线程池中,在需要的时候创建即可。虚拟线程的调度
  虚拟线程由 JDK 负责调度。JDK 把虚拟线程分配给平台线程,平台线程则由操作系统进行调度。
  一个虚拟线程所分配的平台线程被称为该虚拟线程的载体。在整个生命周期过程中,一个虚拟线程可能就会被调度到多个载体上。载体的标识对于虚拟线程是不可见的。
  JDK 调度虚拟线程时,使用的是一个以 FIFO 模式工作的 work-stealing ForkJoinPool。该 ForkJoinPool 的 parallelism 决定了调度时可以使用的平台线程的数量。该数量默认等于处理器的数量(通过 Runtime.availableProcessors() 获取),也可以通过系统属性 jdk.virtualThreadScheduler.parallelism 来设置。虚拟线程如何执行代码?
  在执行虚拟线程的代码时,JDK 的线程调度器把虚拟线程分配到一个平台线程上执行。这个过程称为把虚拟线程绑定(mount)到平台线程。这个平台线程就成为了该虚拟线程的载体。在执行了某些代码之后,该虚拟线程可以从平台线程上解除绑定(unmount)。
  当虚拟线程在等待 I/O 或是执行某些阻塞操作时,可以从平台线程上解除绑定。等阻塞操作完成之后,该虚拟线程可以被调度到新的平台线程上继续执行。虚拟线程的绑定和解除绑定操作,对于应用代码来说是透明的。
  有些 JDK 中的阻塞操作并不会解除对平台线程的绑定,因此会阻塞平台线程和底层的操作系统线程。这是由于操作系统或 JDK 自身的限制,比如很多文件操作以及 Object.wait() 方法调用都会产生这个效果。这些阻塞操作的实现会在内部对此进行补偿。具体的做法是临时增加 JDK 的调度器可以使用的线程数量。因此,JDK 调度器的 ForkJoinPool 中的线程数量可能会超过 parallelism 指定的值。可以使用系统属性 jdk.virtualThreadScheduler.maxPoolSize 来指定调度器所允许的线程的最大值。
  在下面两种情况下,虚拟线程在执行阻塞操作时,会被锁定(pin)在载体上而无法解除绑定:在执行 synchronized 方法或块时,在执行 native 方法或外部方法时。
  虚拟线程的锁定可能会对应用的可伸缩性产生影响。当锁定发生时,调度器并不会对此进行补偿。为了避免经常出现的较长时间的锁定,可以考虑把 synchronized 方法或块替换成 java.util.concurrent.locks.ReentrantLock。不过这种替换,应该建立在进行了充分性能测试的基础上。在大多数时候,锁定的影响并没有很大。虚拟线程代码展示
  介绍了这么多虚拟线程的内容之后,我们来看看到底如何在代码中使用虚拟线程。
  首先是如何创建虚拟线程。创建虚拟线程的第一种方式是使用 Thread.ofVirtual() 方法。在下面的代码中,一个新的虚拟线程被创建并启动。返回值 thread 是 java.lang.Thread 类型的对象。var thread = Thread.ofVirtual().name("my virtual thread")     .start(() -> System.out.println("运行中"))
  第二种方式是使用 Thread.startVirtualThread(Runnable task) 方法。这个方法等同于 Thread.ofVirtual().start(task)。
  第三种方式是使用 ThreadFactory,如下面的代码所示。首先创建一个 ThreadFactory,再使用 ThreadFactory 的 newThread 方法。var factory = Thread.ofVirtual().factory(); var thread = factory.newThread(() -> System.out.println("在工厂中创建"));
  另外一种更常用的方式是使用 ExecutorService。ExecutorService 可以为每个任务启动一个虚拟线程。这一类的 ExecutorService 对象可以使用 Executors.newVirtualThreadPerTaskExecutor() 或 Executors.newThreadPerTaskExecutor(ThreadFactory threadFactory) 方法来创建。这一类的 Executor 对象所能创建的线程数量理论上没有上限(受限于内存)。
  在下面的代码中,创建了一个使用虚拟线程的 ExecutorService 对象,并向该 ExecutorService 提交了10000个任务。每个任务会休眠 1 秒钟。运行这段代码可以发现,所需要的执行时间很短,也不需要太多的资源。try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {   IntStream.range(0, 10_000).forEach(i -> executor.submit(() -> {     Thread.sleep(Duration.ofSeconds(1));     return i;   })); }
  最后展示一下 JDK 内部库对虚拟线程的支持。很多 JDK 内部库已经对虚拟线程提供了支持,主要是与 HTTP 和 TCP 相关的库,可以采用 thread-per-request 的模式。
  下面的代码使用 JDK 自带的 HTTP 服务器功能来实现一个返回当前时间的服务。HTTP服务器使用的Executor 对象由 Executors.newVirtualThreadPerTaskExecutor() 方法创建,对每个请求使用虚拟线程来处理 。import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import java.io.IOException; import java.net.InetSocketAddress; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.concurrent.Executors;  public class SimpleHttpServer {    public static void main(String[] args) throws IOException {     new SimpleHttpServer().start();   }    public void start() throws IOException {     var server = HttpServer.create(new InetSocketAddress(8000), 0);     server.createContext("/time", new TimeHandler());     server.setExecutor(         Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("time-server-", 1).factory()));     server.start();     System.out.println("Time server started");   }    private static class TimeHandler implements HttpHandler {      @Override     public void handle(HttpExchange exchange) throws IOException {       var response =           String.format(               "%s,线程是 %s",               LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME),               Thread.currentThread().getName());       exchange.sendResponseHeaders(200, response.length());       try (var out = exchange.getResponseBody()) {         out.write(response.getBytes());       }     }   } }
  运行服务器之后,访问 http://localhost:8000/time 时可以看到类似 "2022-08-31T22:38:54.1251881,线程是 time-server-4" 这样的返回结果。
  以上就是关于虚拟线程的基本内容,更多的内容会在后续的文章中介绍。

2。18历史今天大事件1。1294元世祖忽必烈逝世孛儿只斤。忽必烈忽必烈是早期蒙古贵族中比较能接纳中原汉族文化者,他尊重儒学佛教,也乐于模仿前代汉人王朝的制度。但作为世界性的蒙古帝国中的一份子,作为游牧最高954万元!非上市险企高管高薪背后32家公司亏损中新经纬2月18日电(李自曼)近日,非上市险企的2022年第四季度偿付能力报告出炉,多家非上市险企首次披露了高管的薪资情况。其中,多家寿险公司2022年度董监高最高薪酬超过500万说出来你可能不信,做彩票生意的,竟然能亏损8000多万2月财经新势力鸿博股份是福建省福州市的一家上市公司,公司于2008年5月8日上市,上市之初的发行价是13。88元,公司目前拥有员工1138人,人均薪资12。16万元。鸿博股份的主营成都口岸回暖,14吨波士顿龙虾包机抵蓉今日(18日),成都进口波士顿龙虾首次以包机形式飞抵成都!红星新闻记者从双流区获悉,历经约48小时,今日,一架载有进口波士顿龙虾的波音747全货机从美国纽约飞抵成都双流。伴随着这批扭亏靠大量关店?阿里入股的德生堂闯关IPO引质疑华夏时报(www。chinatimes。net。cn)记者于娜北京报道前有头部药房企业抢地盘,后有其他同业者追赶,德生堂选择冲刺IPO更加意味深长。近日,德生堂医药股份有限公司首次雄安央企总部建设提速!中国华能总部9月30日前主体封顶北京日报客户端记者白波甘南位于雄安新区启动区总部商务片区的中国华能总部项目,近日已顺利完成桩基工程,正式进入地下结构工程施工阶段。项目建筑面积约11。11万平方米,地上部分北侧塔楼2月17日新闻夜览神十四乘组返回后首次与公众见面都说了啥社保缴费满15年是否可以不缴了取消预售制的时机到了吗集萃数说河南2023年河南春运收官!3543。3万客流量彰显生机与活力图说中原神话治水禹迹遍中原全面实行股票发行注册制正式实施2月17日,中国证监会发布全面实行股票发行注册制相关制网贷还完征信显示未结清,这是什么原因导致的?在银行申请贷款的时候,都是要求用户网贷是已经结清的状态,如果有未结清的情况是没有办法申请贷款的,但是有些朋友出现了网贷还清了,但是在征信上还是显示这未结清,这是什么原因导致的,下面狼首新皮6元限时秒杀!我居然被设计成了皮肤?好兄弟,你怎么看好消息好消息恭喜大仙成为赛宝首席主理人也是首位拥有王者赛宝首席官方认证头衔的主播另外,由688主理的688仙友春季争霸赛也上线啦想要报名的仙友走过路过别错过奖品丰厚,等你来拿源梦设骨质疏松日常如何预防生活中,经常听人讲,膝盖开始疼了,自己是不是骨质疏松了?所以就盲目自行服钙片。还是去医院做相应的检查,诊断为好,否则钙超标对身体也不利。日常我们如何预防呢?加强腰围和体重管理,关注别人产后皮肤依旧那么好,是否很羡慕呢?其实做好这些,你也可以头条创作挑战赛怀孕期间,女星体内激素会发生变化,很多孕妈都会因此皮肤变得差,但是也有聪明的孕妈,做了这些事情,不但使得皮肤没有变差,反而还比怀孕前更好了,皮肤变得白里透红细腻光滑,
专访招商基金首席经济学家李湛注册制下企业应当见贤思齐提升经营水平,上市才能水到渠成21世纪经济报道记者毕华章西安报道经过3年多的试点探索,以信息披露为核心的IPO注册制改革试点取得诸多成效,此前A股注册制上市公司也已迈上1000家台阶。目前,市场广泛认为全面实行深圳春节日历正月初一卯时春入户,兔岁喜盈门深圳年味从不缺节日气氛和烟火气息迎春纳福福气满满的一年从翻阅深圳春节日历开始吧今日正月初一圳撼春晚深圳元素闪耀科技范春晚春晚今年央视春晚,多项创新技术应用台前打造木兰新乡村培育文旅新业态第三季打卡黄陂直播节产业季第二场启动走进武汉城市花园,在木兰生态旅游区域裕和夫子山沐浴天然氧吧,湖水碧透群山环绕,徜徉在绿道碧水间,小住于木屋雅居中,观山奇石怪林幽水美胜景在木兰不夜城领略古风古韵,穿越千年时光,品读贾跃亭会回国吗?FF与黄冈签框架协议推动产业布局和中国总部落地贾跃亭创立的FF计划落户湖北省黄冈市。当地时间1月17日,智能电动汽车生产商法拉第未来(FaradayFuture,FF)宣布与湖北黄冈市政府达成了不具约束力的合作框架协议,以推动中国企业讲述中国故事检出率超过99。99,这家企业以AI工业视觉赋能国内高端制造业来源人民网上海频道国内高端制造工业领域大部分环节采用了自动化生产,但在检测环节人工目视存在检测效率低准确率低对人眼伤害大且成本高等问题。用基于AI技术的产品替代人力做这种重复性工作卢伟冰高端成了?苹果官网出Bug,红米10A折价3000元苹果在全球大部分地区提供以旧换新服务,老款设备可抵扣部分金额,用更优惠的价格购买新机,但优度远小于用户自己卖二手机。不过有网友爆料,苹果官方日前出现一个巨大Bug,小米旗下百元机红事件驱动模型实践前言Spring的框架中还是在日常MVC代码的编写过程中,巧用事件驱动模型都能很好的提高代码的可维护性。因此,本文将对DDD中使用事件驱动模型建立与踩坑做一个系统性的介绍。从应用层古尔曼苹果提前至1月发布新品意为提振第1季度财报IT之家1月23日消息,苹果在今年1月推出了包括HomePod2采用M2Pro和M2Max芯片的1416英寸MacBookPro全新的MacMini,这可能意味着2023年的春季特连续两年过年,六安市委书记会见回老家的华为常务董事余承东1月20日上午,六安市委书记叶露中会见华为技术有限公司常务董事余承东一行,就深化双方对接合作进行详细交流。叶露中首先对余承东一行的到来表示欢迎,对华为技术有限公司一直以来对六安老区三星旗舰SSD990PRO被曝出健康度下降过快问题,官方拒绝质保IT之家1月22日消息,990PRO是三星目前的旗舰消费级SSD,1TB的售价高达999元,2TB高达2199元。然而,今日外媒Neowin编辑RobbieKhan撰文称,他的99关于Linux中firewalld的一些笔记整理写在前面嗯,今天和小伙伴们分享一些firewall的笔记内容涉及zone的介绍具和具体规则的添加服务,端口和协议,ICMP阻塞,SNATDNAT,IP伪装,端口转发等Demofir