在早期的操作系统中,执行任务被抽象为进程(Process)。其中,进程是操作系统运行和调度的基本单元。
随着计算机技术的不断发展,由于进程开销资源较大,以进程为调度单位的方式逐渐产生弊端。因此,计算机先进工作者(科学家)们在进程的基础上,提出了线程(Thead)的概念。
线程是进程中的运行单位,可以把线程看作轻量级的进程。计算机CPU会按照某种策略为每一个线程分配一定的时间片去执行。
进程是指程序的一次动态执行过程,计算机中正在执行的程序就是进程,每一个程序都对对应着各自的一个进程。
一个进程包含了从代码加载完毕到执行完成的一个完成过程,是操作系统中资源分配的最小单位。
线程是比进程更小的执行单元,是计算机CPU调度和分配的基本单位。
每一个进程都会至少包含一个线程,而一个线程只属于一个进程。
每一个进程都有自己的资源,一个进程内的所有线程都共享这个进程所包含的资源。
每一个线程可以对所属进程的所有资源进行调度和运算,其中,线程可以是操作系统内核来控制调度,也可以是由用户程序来控制调度。
基本定义
现代计算机,从组成部分上来看,大体可以分为硬件和软件两个部分。硬件是基础,而软件是运行在硬件之上的程序。
其中,软件可以分为操作系统和应用程序:
操作系统(Operation System):专注于对硬件的支持和交互管理并提供一个运行环境给应用程序使用
应用程序(Application Program):能实现若干功能且运行在操作系统中的软件
由于线程可以由操作系统内核和用户程序来控制调度,因此按照操作系统和应用程序两个层次来分类。
线程可以主要分为内核线程和 用户线程(应用线程)两类,其中:
内核线程(Kernel Thread):由操作系统内核支持和管理的线程,内核线程的创建,启动,同步,销毁,切换等均由操作系统完成。
用户(应用线程,Applciation Thread)线程(User Thread) :用户(应用)线程的管理工作在用户(应用)空间完成,它完全建立在用户(应用)空间的线程库上,由内核支持但不由内核管理,内核也无法感知用户线程的存在。用户(应用)线程的创建,启动,同步,销毁,切换等均在在用户(应用)空间完成,不用切换到内核。
从Java领域来看,Java语言编译后的字节码(Byte Code) 运行在JVM (Java 虚拟机)上,其中JVM其实是一个进程,所以Java属于应用程序层。
我们都知道,Java的线程类为:java.lang.Thread,当任务不能在当前线程中执行时,我们就会去创建一个Thread对象。
我们在Java层通过new 关键字创建一个Thread对象,然后调用start()方法启动该线程,那么从线程的角度来看,主要可以分为:
Java应用程序层线程(Java Application Thread ):主要是Java语言编程的程序创建的Thread线程对象,属于用户空间
Java虚拟机层线程(Java JVM Thread ):主要是Java虚拟机中包含且支持和管理的线程,属于用户空间,
操作系统层线程(OS Thread):根据操作系统的实际情况而定的抽象表示,主要是看操作系统和库是否支持和管理的线程,一般Linux主要通过pthread库来实现,早期版本不支持。
其中,在Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备好以后,就会创建一个操作系统原生线程。
Java 线程结束,原生线程随之被回收。操作系统负责调度所有线程,并把它们分配到任何可用的 CPU 上。
当原生线程初始化完毕,就会调用 Java 线程的 run() 方法。当线程结束时,会释放原生线程和 Java 线程的所有资源。
一般在Hotspot JVM 后台运行的系统线程主要有下面几方面:
虚拟机线程(VM thread):这个线程等待 JVM 到达安全点操作出现。这些操作必须要在独立的线程里执行,因为当堆修改无法进行时,线程都需要 JVM 位于安全点。这些操作的类型有:stop-theworld
垃圾回收、线程栈 dump、线程暂停、线程偏向锁(biased locking)解除。
周期性任务线程: 这线程负责定时器事件(也就是中断),用来调度周期性操作的执行。
GC 线程: 这些线程支持 JVM 中不同的垃圾回收活动。
编译器线程: 这些线程在运行时将字节码动态编译成本地平台相关的机器码。
信号分发线程: 这个线程接收发送到 JVM 的信号并调用适当的 JVM 方法处理。
由此可见,Java层到内层层的线程创建的大致流程:java.lang.Thread(Java应用程序层)—>Java Thread(JVM 层)->OS Thread(操作系统层)->pthread(根据操作系统的情况而定)->内核线程(Kernel Thread)。
更多关于“java培训”的问题,欢迎咨询千锋教育在线名师。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。