你的位置:首页 > 软件开发 > Java > Java Thread:揭开Run方法被调用的真正面纱

Java Thread:揭开Run方法被调用的真正面纱

发布时间:2016-03-08 04:00:36
导语我们知道,new一个thread,调用它的start的方法,就可以创建一个线程,并且启动该线程,然后执行该线程需要执行的业务逻辑,那么run方法是怎么被执行的呢?Java线程和os线程os线程我们知道,java的一个线程实际上是对应了操作系统的一个线程;而操作系统实现线程有三 ...

Java Thread:揭开Run方法被调用的真正面纱

导语

我们知道,new一个thread,调用它的start的方法,就可以创建一个线程,并且启动该线程,然后执行该线程需要执行的业务逻辑,

那么run方法是怎么被执行的呢?

Java线程和os线程

os线程

我们知道,java的一个线程实际上是对应了操作系统的一个线程;

而操作系统实现线程有三种方式:

  • 内核线程实现
  • 用户线程实现
  • 用户线程加轻量级进程混合实现

具体详细实现方式就不具体讲了,参见 «深入理解 JAVA虚拟机»第二版 第12章 Java内存模型与线程(378页)

Java线程

Java线程在JDK1.2之前,是基于用户线程实现的。而在JDK1.2中,线程模型替换为基于操作系统原生线程模型来实现。

而在目前的JDK版本中,操作系统支持怎样的线程模型,在很大程度上决定了Java虚拟机的线程是怎样映射的,这点在不同的平台上没法达成一致。

对于Sun JDK来说,它的Windows版本和Linux版本都是使用一对一的线程模型实现的,一条Java线程映射到一条轻量级进程之中。

以上按个人理解摘自: «深入理解 JAVA虚拟机»第二版

Java线程创建

创建方式

Java Thread:揭开Run方法被调用的真正面纱

Desc:我们看到,无论以哪种方式创建,最终我们都会重写一个叫做 run 的方法,来处理我们的业务逻辑,然而我们都是调用一个start方法,来启动一个线程;

那 start方法和run方法之间是一个什么关系呢?从后边的介绍我们将获得这样一个信息:run就是一个回调函数,和我们普通的函数没有区别。

Java线程的实现

一个 Java 线程的创建本质上就对应了一个本地线程(native thread)的创建,两者是一一对应的。

关键问题是:本地线程执行的应该是本地代码,而 Java 线程提供的线程函数(run)是 Java 方法,编译出的是 Java 字节码,

所以, Java 线程其实提供了一个统一的线程函数,该线程函数通过 Java 虚拟机调用 Java 线程方法 , 这是通过 Java 本地方法调用来实现的。

以下是 Thread#start 方法的示例:

 Java Thread:揭开Run方法被调用的真正面纱

可以看到它实际上调用了本地方法 start0, 而start0声明如下:

private native void start0();

Java线程创建调用关系

Java Thread:揭开Run方法被调用的真正面纱


原标题:Java Thread:揭开Run方法被调用的真正面纱

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。