什么是线程,如何查看线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是线程,如何查看线程相关的知识,希望对你有一定的参考价值。

1.线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
2.VS 开发工具自带的 SPY++ 就可以查看线程了。
参考技术A 一个线程是给定的指令的序列 (你所编写的代码),一个栈(在给定的方法中定义的变量),以及一些共享数据(类一级的变量)。线程也可以从全局类中访问静态数据。 栈以及可能的一些共享数据 每个线程有其自己的堆栈和程序计数器(PC)。你可以把程序计数器(PC)设想为用于跟踪线程正在执行的指令,而堆栈用于跟踪线程的上下文,上下文是当线程执行到某处时,当前的局部变量的值。虽然你可以编写出在线程之间传送数据的子程序,在正常情况下,一个线程不能访问另外一个线程的栈变量。 一个线程必须处于如下四种可能的状态之一,这四种状态为: 初始态:一个线程调用了new方法之后,并在调用start方法之前的所处状态。在初始态中,可以调用start和stop方法。 Runnable:一旦线程调用了start 方法,线程就转到Runnable 状态,注意,如果线程处于Runnable状态,它也有可能不在运行,这是因为还有优先级和调度问题。 阻塞/ NonRunnable:线程处于阻塞/NonRunnable状态,这是由两种可能性造成的:要么是因挂起而暂停的,要么是由于某些原因而阻塞的,例如包括等待IO请求的完成。 退出:线程转到退出状态,这有两种可能性,要么是run方法执行结束,要么是调用了stop方法。 最后一个概念就是线程的优先级,线程可以设定优先级,高优先级的线程可以安排在低优先级线程之前完成。一个应用程序可以通过使用线程中的方法setPriority(int),来设置线程的优先级大小。本回答被提问者采纳

漫话:如何给女朋友解释为什么Java线程没有Running状态?

在多线程操作系统中,通常是在一个进程中包括多个线程,每个线程都是作为利用CPU的基本单位,是花费最小开销的实体。

线程是有状态的,线程的状态被定义在Thread.State枚举中,在Java Doc中也有明确的解释:

通过查看源码以及阅读Java Doc,我们可以知道,线程主要有以下6种状态:

  • NEW

    • 当一个线程被创建出来的,但是还没调用start()方法的时候,他处于NEW状态。

  • RUNNABLE

    • 在Java虚拟机中执行的线程处于这种状态

  • BLOCKED

    • 正在等待锁的阻塞线程处于这种状态。

  • WAITING

    • 不确定地等待另一个线程执行某个特定操作的线程就是处于这种状态,进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

  • TIMED_WAITING

    • 在指定的等待时间内等待另一个线程执行某个操作的线程处于这种状态。该状态不同于WAITING,它可以在指定的时间后自行返回。

  • TERMINATED

    • 已经退出的线程处于这种状态。

在指定的时间点,线程只能处于一种状态。但是需要注意的是这些状态表示的是虚拟机中线程的状态,而不是任何操作系统线程状态。

线程之间的状态是可以互相转换的,如下图:

上图,就是线程的6种状态的转换图,当遇到不同的操作或者事件的时候,线程的状态就可能发生变化。

Java Doc中说在Java虚拟机中正在执行的线程处于RUNNABLE状态,但是,在操作系统层面,一个线程要想被执行,是需要获得CPU的使用权的。

我们其实还可以把RUNNABLE状态进一步细化一下,根据线程是否获得了CPU的使用权分成两种:

  • 就绪(READY):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中并分配cpu使用权 。

  • 运行中(RUNNING):就绪(READY)的线程获得了cpu 时间片,开始执行程序代码。

也就是说,当一个线程被创建出来之后,执行了start方法之后,在没有获得cpu的使用权的时候,他就是就绪状态(READY),在获得了CPU的使用权,开始执行的时候,就是运行状态(RUNNING)了。

为什么没有定义RUNNING状态?

对于现在的分时操作系统来说,在单CPU情况下,所有的线程其实都是串行执行的。但是为了让我们看起来像是在并发执行,人们把CPU的执行分成很多个小的时间片。

哪个进程得到时间片,那个线程就执行,时间片到了之后,就要释放出CPU,再重新进行争抢时间片。

只要把时间片划分的足够细,那么多个程序虽然在不断的串行执行,但是看起来也像是在同时执行一样。

那么,CPU的时间片其实是很短的,一般也就是10-20毫秒左右。

那么,也就是说,在一秒钟之内,同一个线程可能一部分时间处于READY状态、一部分时间处于RUNNING状态。

那么如果,明确的给线程定义出RUNNING状态的话,有一个很大的问题,就是这个状态其实是不准的。

因为当我们看到线程是RUNNING状态的时候,很有可能他已经丢失了CPU时间片了。

对于线程的状态,我们只需要知道,他当前有没有在"正在参与执行"就行了,何为"参与执行"?

就是他的状态是可执行的,只要获得时间片,就能立即执行。

那这不就是RUNNABLE吗?

所以,Java就没有给线程定义RUNNING状态,而是定义了一个RUNNABLE状态。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

以上是关于什么是线程,如何查看线程的主要内容,如果未能解决你的问题,请参考以下文章

Linux查看系统cpu个数、核数、线程数

nmon如何查看CPU被哪些线程占用了

如何查看cpu核心数和线程数?

如何在 VS 2010 中使用 Nvidia NSight 查看 CUDA 线程值?

如何查看cpu核心数和线程数?

漫话:如何给女朋友解释为什么Java线程没有Running状态?