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