Java 异步编程——Java两级调度模型与内置线程调度器(Executor 框架)


在 Java1.5 以前,开发者必须手动实现自己的线程池;从 Java1.5 开始,Java 内部提供了线程池。

Java 异步编程——既然可以手动创建线程,为什么还要使用线程池这篇文章提到过Java线程会映射到操作系统本地线程上,使得 Java 线程能够在操作系统层面上得到执行,在大多数情况下,每个 Java 线程都会对应一个本地操作系统线程,但具体的映射方式和数量由 JVM 和操作系统的实现决定。这里Java线程与操作系统本地线程两个层次的线程模型,存在两个层次的调度机制。所以在介绍Java内置线程池之前,先一起了解Java多线程的两级调度模型。

Java多线程的两级调度模型

Java 多线程的两级调度模型是指在 Java 多线程程序中,存在两个层次的调度机制:用户级调度和操作系统级调度。

用户级调度:(用户级线程 ULT)

  • 用户级线程由 Java 虚拟机(JVM)自身管理,不需要操作系统内核的介入。
  • 用户级调度是指由应用程序自身实现的线程调度机制。在这一级别上,应用程序可以使用 Java 提供的并发编程工具(例如 Executor 框架、线程池等用户级的调度器)来管理和调度线程。应用程序根据自身的需求,将任务分配给可用的Java线程,决定线程的执行顺序和优先级等。Java 线程是由 JVM 提供的线程管理机制来调度执行的,所以用户级调度是在 Java 层面上进行的,不涉及操作系统的线程调度。

操作系统级调度:(内核级线程 KLT)

  • 内核级线程是由操作系统内核管理的真正的系统级线程。
  • 操作系统级调度是指操作系统内核对线程进行的调度和执行。在这一级别上,操作系统负责将Java线程映射到底层的操作系统线程(本地操作系统线程),并分配 CPU 进行实际的计算。操作系统线程模型可以利用操作系统提供的并发机制和资源管理功能,如线程调度器、线程优先级、时间片轮转等,以确保公平性和资源利用的最大化。

两级调度模型的优势:

Java 多线程的两级调度模型的优势在于结合了用户级调度和操作系统级调度的特点:

  • 用户级调度使应用程序具有灵活性和可控性,可以根据具体需求自主管理和调度线程。Java 线程模型提供了高级的并发编程抽象,使得开发者可以更方便地编写并发程序,从而可以根据任务的特点和优先级,自主决定线程的创建、启动、休眠、唤醒等操作,实现更细粒度的线程调度。
  • 操作系统级调度利用了底层操作系统的调度机制和资源管理功能,确保线程的公平性和高效利用。操作系统级调度可以根据底层硬件的特点和系统负载情况,智能地分配线程执行的资源,提高性能和资源利用率。
  • 用户级线程的创建、切换和调度都发生在 JVM 内部,效率较高;内核级线程的创建、切换和调度需要操作系统内核的参与,开销相对较大。
  • 当一个用户级线程阻塞(如进行 I/O 操作)时,如果是单线程,整个进程也会被阻塞,无法利用其他可用的 CPU 资源;在多线程情况下,JVM 会将其挂起,并将另一个可运行的用户级线程映射到内核级线程上继续执行,避免了进程级的阻塞,提高整体并发性能。
    在这里插入图片描述

Executor 框架

上面讲述了 Java 多线程的两级调度模型,对于Java编程,我们只需关注用户级调度(Java线程)。Java 多线程管理是由在 Java 内置的 Executor 框架下完成的。Executor 框架是 Java 5 引入的一套用于异步任务执行的API,提供了一种简化线程管理和任务执行的方式,将任务的提交和执行分离开来。

Executor 框架的组成概念

首先简单介绍一下 Executor 框架的组成概念。

  1. 任务:任务指的是被异步执行的工作单元(工作代码),任务需要实现接口:Runable 接口 or Callable 接口;

    • Runable 接口:只定义了一个没有返回值的 run() 方法,用于封装需要执行的任务代码
      public interface Executor {
             
             
          void execute(Runnable command);
      }
      
    • Callable 接口:只定义了一个带返回值的 call() 方法,用于封装需要执行的任务代码并返回结果。
      @FunctionalInterface
      public interface Callable<V> {
             
             
          V call() throws Exception;
      }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值