JVM之线程实现

来源:互联网 发布:s7200plc编程软件下载 编辑:程序博客网 时间:2024/06/05 14:37

  • 线程
    • 1 实现线程的方式
      • 11 使用内核线程实现
      • 12 使用用户线程实现
      • 13 用户线程加轻量级进程混合实现
    • 2 Java的线程实现

并发不一定要依赖多线程,PHP中有多进程并发。但是,Java里面的并发是多线程的。

1. 线程

参考:Java多线程之基本概念

线程是比进程更轻量级的调度执行单位。线程可以把一个进程的资源分配执行调度分开。一个进程里可以启动多条线程,各个线程可共享该进程的资源(内存地址,文件IO等),又可以独立调度。线程是CPU调度的基本单位。

1.1 实现线程的方式

主流OS都提供线程实现。Java语言提供对线程操作的同一API,每个已经执行start(),且还未结束的java.lang.Thread类的实例,代表了一个线程。

Thread类的关键方法,都声明为Native。这意味着这个方法无法或没有使用平台无关的手段来实现,也可能是为了执行效率。

1.1.1 使用内核线程实现

内核线程(Kernel-Level Thread, KLT)就是直接由操作系统内核支持的线程。

  • 内核来完成线程切换
  • 内核通过调度器Scheduler调度线程,并将线程的任务映射到各个CPU上
  • 程序使用内核线程的高级接口,轻量级进程(Light Weight Process,LWP)–>(!!!名字是进程,实际是线程)
  • 用户态和内核态切换消耗内核资源

1.1.2 使用用户线程实现

  • 系统内核不能感知线程存在的实现
  • 用户线程的建立、同步、销毁和调度完全在用户态中完成
  • 所有线程操作需要用户程序自己处理,复杂度高

1.1.3 用户线程加轻量级进程混合实现

  • 轻量级进程作为用户线程和内核线程之间的桥梁

1.2 Java的线程实现

操作系统支持怎样的线程模型,在很大程度上就决定了Java虚拟机的线程是怎样映射的。

上述的3种线程模型,只对线程的并发规模和操作成本有影响,对Java程序的编码和运行过程来说,这些差异是透明的。

线程调度是系统为线程分配处理器使用权的过程

线程调度

  • 协同式线程调度 (Cooperative Threads-Scheduling)
    • 实现简单,没有线程同步的问题。但是线程执行时间不可控,容易系统崩溃。
  • 抢占式线程调度 (Preemptive Threads-Scheduling)
    • 每个线程由系统来分配执行时间,不会有线程导致整个进程阻塞的问题。

虽然Java线程调度是系统自动完成的,但是我们可以建议系统给某些线程多分配点时间——设置线程优先级

线程的setPrority()方法

Java语言有10个级别的线程优先级,优先级越高的线程,越容易被系统选择执行。

但是并不能完全依靠线程优先级。因为Java的线程是被映射到系统的原生线程上,所以线程调度最终还是由操作系统说了算。

如Windows中只有7种优先级,所以Java不得不出现几个优先
级相同的情况。同时优先级可能会被系统自行改变。Windows系统中存在一个“优先级推进器”,当系统发现一个线程执行特别勤奋,可能会越过线程优先级为它分配执行时间。

优先级

0 0
原创粉丝点击