操作系统线程和Java线程的区别
在计算机编程中,线程是一段旨在由 CPU 调度并独立于父进程执行的简短指令序列。程序中可能同时有多个线程处于活动状态,当任务完成或应用程序关闭时,程序会关闭或挂起这些线程。多线程 CPU 能够同时运行多个线程。以下是操作系统线程和 Java 线程之间的区别。
Java 中的线程
在 Java 中,线程是程序运行期间遵循的流程或路径。所有程序通常至少有一个主线程,该线程由 JVM(Java 虚拟机)在程序执行开始时提供。当主线程获得控制权时,现在由主线程调用 main() 方法。
程序的执行线程称为线程。在 Java 虚拟机上运行的程序可以同时执行多个线程。每个线程都有不同的优先级。优先级顺序决定了哪些线程首先运行。
由于它允许在单个函数中执行多个操作,因此线程对于程序至关重要。程序计数器、堆栈和局部变量通常对每个线程都是唯一的。
Java 提供两种不同的创建线程的技术:
扩展 java.lang.class 的线程。
实现 Runnable 接口。
扩展 Java.lang.class
这是一个新类扩展了 Thread 类,生成该类的实例,这将导致创建线程。Thread 应该执行的功能包含在 run() 方法中。创建线程后,可以使用 start() 使其可运行。在 void run() 过程中,将启动一个新线程。
实现 Runnable 接口
这是创建线程的最简单方法。在这种情况下,开发一个类来实现 Runnable 接口和 run() 方法。始终在 run() 方法内部编写线程运行代码。
start() 方法调用 void run() 方法。当调用 start() 时,将为线程提供一个新的堆栈,然后调用 run() 将线程引入程序。
什么是操作系统线程?
线程是唯一的执行路径。由于它是一个小型进程,因此操作系统可以将其安排与其他线程一起运行。线程由操作系统创建和管理,与创建它们的程序共享内存和资源。这使得多个线程能够在单个应用程序内协作并有效地运行。
在进程内,线程是单个序列流。由于它们与进程共享某些特性,因此线程通常被称为轻量级进程。每个线程仅属于一个进程。在支持多线程的操作系统中,进程可以在一个进程下有多个线程。
线程类型
同一进程的每个线程都使用不同的程序计数器、激活记录堆栈和一组控制块。使用线程可以提高程序的性能。
操作系统中存在两种不同的线程类型:内核级线程和用户级线程。
内核级线程
操作系统在内核级别实现和控制线程。
内核级线程是使用系统调用实现的,操作系统知道它们。
用户级线程的创建和管理速度比内核级线程快。
内核级线程的上下文切换速度较慢。
一个内核级线程是否执行阻塞操作不会影响其他线程。例如 Window Solaris。
内核不知道用户级线程,因为它们是由用户实现和控制的。
用户级线程
用户级线程是使用用户级库创建的,操作系统不知道它们。
与内核级线程相比,用户级线程更容易创建和维护。
用户级线程的上下文切换速度更快。
如果只有一个用户级线程执行阻塞任务,则整个进程将停止。例如 Java 线程、POSIX 线程等。
Java 线程和操作系统线程的区别
下表重点介绍了 Java 线程与操作系统线程的不同之处:
Java 线程 |
操作系统线程 |
---|---|
在 Java 上下文中,线程是在程序执行期间遵循的路径 |
操作系统能够处理的最小处理单元是线程 |
Java 程序中至少存在一个线程,称为主线程 |
一个进程可以有多个线程 |
在 Java 中,用户线程和守护线程是两种不同的线程类型 |
操作系统线程有两种不同的类型:用户级线程和内核级线程 |
在程序开始时,使用主线程调用 main() 方法时,它由 Java 虚拟机 (JVM) 控制 |
操作系统负责管理它 |
线程通信由 wait()、notify() 和 notifyAll() 方法提供便利 |
线程可以更轻松地通信并交换通用信息 |
监视器用于实现线程同步,同步块用于阻塞 |
使用互斥体是实现线程同步的最常用方法 |
Java 虚拟机 (JVM) 中的线程调度程序决定哪个线程应该运行。两种类型分别是抢占式调度和时间片 |
应用程序开发人员通过轻量级进程 (LWP) 将用户级线程 (ULT) 调度到内核级线程 (KLT)。 系统调度程序将内核级线程调度以执行各种不同的操作系统功能。 |
结论
在 JVM 进程中运行的任何线程都称为“Java 线程”。尽管具有不同的线程 ID,但操作系统线程都是进程的一部分的线程,并且共享相同的进程 ID 和父进程 ID。