java - 当所有 JAVA 线程都是使用 OS 库创建的 Native 线程时,为什么要引入 Fork/Join 框架?
问题描述
我所知道的是,在 JDK 1.2 之后,所有 Java 线程都是使用“本机线程模型”创建的,该模型在 JNI 和 OS 线程库的帮助下将每个 Java 线程与一个 OS 线程相关联。
所以从下面的文字我相信现在所有创建的Java线程都可以实现多核处理器的使用:
多个本机线程可以共存。因此也称为多对多模型。该模型的这种特性使其能够充分利用多核处理器并同时在单独的单个内核上执行线程。
但是当我在JAVA The Compelete Reference中读到关于在 JDK 7 中引入的 Fork/Join Framework 的介绍时:
尽管最初的并发 API 本身就令人印象深刻,但它在 JDK 7 中得到了显着扩展。最重要的新增功能是 Fork/Join 框架。Fork/Join 框架有助于创建使用多个处理器的程序(例如多核系统中的那些)。因此,它简化了程序的开发,其中两个或多个部分以真正的同时执行(即真正的并行执行),而不仅仅是时间片。
这让我质疑为什么自 JDK 3 以来就存在“Java 原生线程模型”时引入了该框架?
解决方案
Fork join 框架不会取代原来的低级线程 API;它使某些类别的问题更容易使用。
原始的低级线程 API有效:您可以使用系统上安装的所有 CPU 和 CPU 上的所有内核。如果您曾经尝试实际编写多线程应用程序,您会很快意识到这很困难。
低级线程 API 适用于线程在很大程度上独立的问题,并且不必在彼此之间共享信息 - 换句话说,令人尴尬的并行问题。然而,许多问题并非如此。使用低级 API,很难以安全(产生正确结果并且不会产生死锁等不良影响)和高效(不浪费系统资源)的方式实现复杂的算法。
Java fork/join 框架是fork/join 模型的一个实现,它被创建为一种高级机制,以便更容易地将并行计算应用于分治算法。
推荐阅读
- sql-server - Sql Max() 没有为 varchar 类型的列返回正确的值
- python - 有没有办法在新的文本文件中每 5 秒存储一次数据?
- android - Android Short[] to byte[] AudioRecorder 丢帧,播放速度很快
- javascript - 在加入时更改用户昵称 (discord.js)
- python - 使用函数 dask.dataframe.read_sql_table 将多个列名作为输入传递给参数 index_col 以创建 dask 数据帧
- r - 在 CRAN 包中嵌入二进制构建工具?
- python - 在链表中遍历
- java - ObjectUtils defaultIfNull 返回默认值,即使第一个参数不为空
- c# - 使用 CMake 在同一解决方案中创建 C# 和 C++/CLR 项目(针对 Visual Studio 的 CMake)
- c# - 在 C# 中使用 json POST 请求