基于 Hotspot 的 Java 线程源码分析

基本概念

Java 线程其实是映射到操作系统的内核线程上的,所以 Java 线程基本上也就是操作系统在进行管理。在 Linux系统中,线程和进程用的是同一个结构体进行描述的,只不过进程拥有自己独立的地址空间,而同一个进程的多个线程之间是共享资源的。

简单说明: 本文基于 openjdk 1.8 进行

线程状态

每种线程状态的切换条件, 以及调用方法如下图所示 :

image.png

线程具有一下几种状态 Java 的线程状态在 Thread.State 枚举中定义代码如下

public enum State {
    //新创建,未启动
    NEW,

    //在jvm 中运行,也可能正在等待操作系统的其他资源
    RUNNABLE,

    //阻塞,并且正在等待监视器锁
    BLOCKED,

    //处于等待状态的线程,正在等待另一个线程执行特定的操作
    WAITING,

    //限期等待, 可以设置最大等待时间
    TIMED_WAITING,

    //结束
    TERMINATED;
}
复制代码

线程创建

  1. 继承 Thread 类, 代码如下:
class PrimeThread extends Thread {
    long minPrime;
    PrimeThread(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
        . . .
        }
}

// 启动线程
PrimeThread p = new PrimeThread(143);
p.start();
复制代码
  1. 实现 Runable 接口, 代码如下 (通常推荐使用这种方式):
class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
        . . .
        }
}

// 启动线程
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
复制代码

hotspot 源码

JNI 机制

JNI 是 Java Native Interface 的缩写,它提供了若干的 API 实现了Java和其他语言的通信(主要是C和C++)。

33571679_1.gif

JNI的适用场景 当我们有一些旧的库,已经使用C语言编写好了,如果要移植到Java上来,非常浪费时间,而JNI可以支持Java程序与C语言编写的库进行交互,这样就不必要进行移植了。或者是与硬件、操作系统进行交互、提高程序的性能等,都可以使用JNI。需要注意的一点是需要保证本地代码能工作在任何Java虚拟机环境。 ​

JNI的副作用 一旦使用JNI,Java程序将丢失了Java平台的两个优点:

  1. 程序不再跨平台,要想跨平台,必须在不同的系统环境下程序编译配置本地语言部分。
  2. 程序不再是绝对安全的,本地代码的使用不当可能会导致整个程序崩溃。一个通用规则是,调用本地方法应该集中在少数的几个类当中,这样就降低了Java和其他语言之间的耦合。

举个例子 这块操作比较多,可以参考如下的资料

www.runoob.com/w3cnote/jni…

启动流程

启动流程如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值