Java 为什么无法真正意义上开启一条线程?

线程

可根据侧边目录选择阅读

1、线程与进程

线程与进程相似,但线程是一个比进程更小的执行单位,它与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程

进程在其执行的过程中可以产生多个线程。

区别

  • 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。
  • 线程和进程的不同在于基本上各个进程是相互独立的,而各线程则不一定,因为同一进程中的线程一般会相互影响
  • 从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

​简单来说:线程与进程相似,进程系统运行程序的基本单位,而线程是进程划分成的更小的运行单位。线程和进程的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响


2、线程在源码中都有什么状态

我们都知道一个线程从被创建出来后会经历5个阶段,new、就绪、运行、阻塞和终止。

但与源码中有些偏差,我们可以进入Thread.State中查看到,在源码中线程的状态。

在这里插入图片描述
NEW:新生,被构建出来,但还没调用 start() 方法。

RUNNABLE:运行, Java 线程将操作系统中的就绪和运行两种状态庞统地称作“运行”。

BLOCKED:阻塞, 线程阻塞于锁 。

WAITING:等待,死死地等。

TIMED_WAITING:超时等待, 与WAITING不同,可以在指定的时间自行返回的 。

TERMINATED:终止,线程执行完毕。


3、为什么说Java 无法开启一条线程?

我们可以简单的通过源码知道,其实Java是无法启动线程的。进入start()方法:

在这里插入图片描述
方法加了同步锁,把当前线程加入线程组后调用了start0()方法,start0()为本地方法,是属于底层的C++ ,所以说Java 无法直接操作硬件生成线程。

今天犯懒,下次一定把C++源码弄出来


在这里插入图片描述
愿大家心想事成

猜你喜欢

转载自blog.csdn.net/PINKMIAO/article/details/108513947