首页 > 编程语言 >Java 21的Concurrency的笔记

Java 21的Concurrency的笔记

时间:2024-09-08 20:13:35浏览次数:10  
标签:Java 21 thread Virtual 线程 Concurrency java 多线程

Virtual Threads

在Linux系统下,按照用户线程和内核线程的关系来分类:

  • 1:1,即一个用户线程,对应一个内核线程。
    比如Linux的Pthread,JDK的Thread,STL的std::thread。
    优点是实现简单,线程的运行、调度、运行,均由操作系统完成。
    缺点是线程的数量受限,随着线程数量上升,操作系统调整线程运行的成本逐步上升。
  • N:1,即多个用户线程,对应一个内核线程。
    实现复杂,用户线程的调度、运行等工作在用户态,因此可以创建更多的线程。
    缺点是当一个用户线程被IO阻塞时,绑定在内核线程上的其它用户线程,同步被阻塞。
  • M:N,即用户线程和内核线程为多对多关系,二者不是强绑定关系。
    实现复杂,可以解决N:1方案存在的问题。

线程的使用方式:

  • 同步模式
    • 每请求每线程
    • 线程池
    • Reactor模式
  • 异步模式
    • 异步任务
    • 消息队列

官方文档

  • Virtual Threads

    However, a virtual thread isn't tied to a specific OS thread. A virtual thread still runs code on an OS thread. However, when code running in a virtual thread calls a blocking I/O operation, the Java runtime suspends the virtual thread until it can be resumed. The OS thread associated with the suspended virtual thread is now free to perform operations for other virtual threads.

    依据上述描述,Java的Virtual Threads有点类似前述的M:N的关系。

    Virtual threads are suitable for running tasks that spend most of the time blocked, often waiting for I/O operations to complete. However, they aren't intended for long-running CPU-intensive operations.

    依据上述说明,Java的Virtual Threads适合执行经常阻塞的任务,而不是长时间的计算密集型任务。

  • JEP 444

  • java.lang.Thread

  • Foreign Function and Memory API

参考资料

Structured Concurrency

  • Structured Concurrency

    This is a preview feature.

    作为预览版的特性,相关的API的设计目前仍然存在变数,因此当前不建议在项目中使用。
    从官方提供的样例看,对于某些临时创建线程池执行任务的场景,可以简化实现代码,同时质量更好。

        Callable<String> task1 = ...
        Callable<Integer> task2 = ...
    
        try (var scope = new StructuredTaskScope<Object>()) {
    
            Subtask<String> subtask1 = scope.fork(task1);
            Subtask<Integer> subtask2 = scope.fork(task2);
    
            scope.join();
    
            ... process results/exceptions ...
    
        } // close
    
  • JEP 453

  • Preview Language and VM Features

Thread-Local Variables

  • Thread-Local Variables
    不易跟踪、管理的可变性。
    生命周期的管理,创建、传播、读、写等,潜在的内存泄漏问题。
    不恰当的使用或者滥用,可能导致占用过多的内存资源。

标签:Java,21,thread,Virtual,线程,Concurrency,java,多线程
From: https://www.cnblogs.com/jackieathome/p/18403365

相关文章

  • 计算机考研真题知识点——2021(A)
    目录2021(A)一、选择题二、判断题三、简答题四、综合题2021(A)一、选择题1、C语言程序是从程序中的main函数开始执行的。2、 intx=2,y=3,z=4; x<z?y:z //的结果是?34、若说明语句“inta[5],*p=a;”,则对数组元素的正确引用是()A、a[p]B、p[a]C、*(p+2)D、p+......
  • 计算机考研真题知识点——2021(B)
    目录2021(B)一、选择题二、判断题三、简答题四、综合题2021(B)一、选择题1、以下说法正确的是:CA、switch后面括号中放置的可以是值为任意类型的表达式。B、continue和break均可以用在switch语句及循环语句中。C、如果函数的返回类型与返回值类型不一致,以函数的返回类......
  • Java并发编程实战 07 | 如何正确停止线程
    什么时候需要停止一个线程?一个线程被创建并启动之后,大部分情况下都会自然运行至结束,但是也有一些情况需要主动停止线程,比如:用户主动取消执行:用户可能会中止一个正在进行的操作,这时需要停止相关线程。运行时错误或超时:线程可能因为运行时错误或超时而需要被停止,以避免长时......
  • Java并发编程实战 08 | 彻底理解Shutdown Hook
    钩子线程(HookThread)简介在一个Java应用程序即将退出时(比如通过正常执行完成或通过用户关闭应用程序),通常需要进行一些清理操作,例如:释放资源(如文件句柄、网络连接)。关闭数据库连接。保存未完成的数据或状态。我们可以通过钩子线程实现这一点,钩子线程是指在程序结束时,JVM......
  • 【JavaScript】LeetCode:16-20
    文章目录16无重复字符的最长字串17找到字符串中所有字母异位词18和为K的子数组19滑动窗口最大值20最小覆盖字串16无重复字符的最长字串滑动窗口+哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新......
  • JAVA代理-----详细深入介绍
    什么是代理(定义)定义:给目标对象提供一个代理对象,并且由代理对象控制对目标对象的引用为什么要使用JAVA代理(目的)1.功能增强:通过代理业务对原有业务进行增强2.控制访问通过代理对象的方式间接的范文目标对象,防止直接访问目标对象给系统带来不必要的复杂性。例:银行转账的系统......
  • 【Java】Word题库解析2
     初稿见:https://www.cnblogs.com/mindzone/p/18362194一、新增需求在原稿题库之后,还需要生成一份纯题目+ 纯答案答案放在开头,题目里面去掉答案在检查题型时还发现部分内容略有区别: 所以在判断是否为答案的时候需要兼容这种答案二、关于老版本支持doc2000版需要追加......
  • 1-4Java修饰符
    Java修饰符Java语言提供了很多修饰符,主要分为以下两类:访问修饰符非访问修饰符修饰符用来定义类,方法或者变量,通常放在语句的最前端。访问控制修饰符Java中,可以使用访问控制符来保护对类,方法,变量,构造方法的访问。Java支持4种不同的访问权限。default(即默认,什么也不写):在......
  • Java基础第六天-面向对象编程
    类与对象类就是数据类型,对象就是一个具体的实例。类拥有属性和行为。类是抽象的,概念的,代表一类事物,比如人类,猫类等它是数据类型。对象是具体的,实际的,代表一个具体事物,即是实例。类是对象的模板,对象是类得一个个体,对应一个实例。对象在内存中的存在形式:字符串是指向地址保......
  • 6.跟着狂神学JAVA(数组)
    数组数组是相同类型数据的有序集合每一个数据称作一个数据元素,每个数组元素可以通过一个下标来访问获取数组长度:array.length数组的使用声明数组dataType[]arrayName;初始化数组在声明时初始化int[]numbers=newint[5];//创建一个长度为5的整型数组在声明......