java虚拟机-java与线程

java与线程

并发不一定依赖于多线程,例如php的多进程并发。但是java里的并发,多数与线程有关。

线程的实现

我们知道,进程是资源分配的基本单位线程是cpu调度的基本单位。线程既可以共享进程的资源(内存地址,文件i/o等),又可以单独调度。

主流操作系统都提供了线程实现,java语言则提供了在不同硬件操作系统平台下线程操作的统一处理

每个java.lang.Thread类的实例就代表一个线程,其中关键方法都被声明为native。

  • 一个native方法就是一个Java调用非Java代码的接口。一个native方法是指该方法的实现由非Java语言实现,比如用C或C++实现
  • 在定义一个native方法时,并不提供实现体(比较像定义一个Java Interface),因为其实现体是由非Java语言在外面实现的。

关于native关键字

https://www.cnblogs.com/HDK2016/p/7226840.html

线程实现的三种方式

一,使用内核线程实现
内核线程就是直接由操作系统内核(Kernel)支持的线程,由内核完成线程切换,内核通过操纵调度器对线程进行调度,并将线程任务映射到处理器上。每个内核线程都可以看做是内核的一个分身,支持多线程得内核叫做多线程内核。
程序一般不直接使用内核线程,而是使用内核线程的一种高级接口-轻量级进程(LWP)。一般是1:1对应的。
在这里插入图片描述
优点:有内核的支援,线程的创建,切换,调度等操作都由内核实现,不需要用户自己考虑。

局限性:由于基于内核线程的实现,所以进程的各种操作都需要进行系统调用,需要在内核态和用户态之间来回切换,造成代价较高。而且,轻量级进程消耗一定的内核资源(栈空间),所以一个系统支持轻量级进程的数量是有限的。

二,使用用户线程实现
用户线程是完全建立在用户空间的线程库上,系统内核不能感知到线程存在的实现。
用户线程的创建,同步,销毁,调度操作都完全在用户态中完成,不用切换到内核态。如果程序得当(没有系统调用的操作),是不用切换到内核态的,这样达到快速低消耗的目的,可以支持更大规模的线程数量。进程与线程 1:N的关系称为一对多的线程模型。
在这里插入图片描述

缺点:没有系统内核支援,导致所有线程操作(创建,切换,调度)都需要用户自己处理。操作系统只把处理器资源分配个进程,“中断处理”,“多处理器系统,线程任务如何映射到处理器上”等问题的解决都非常困难。所以使用用户线程的程序一般比较复杂,使用也是越来越少。

三,混合实现
内核线程与用户线程一起使用。用户线程还是完全建立在用户空间,线程的操作依然廉价,支持大规模线程并发,而轻量级进程则作为用户线程与内核线程的桥梁,这样就可以使用内核提供的线程调度功能和处理器映射,并且用户线程的系统调用由轻量级进程来完成,大大减低了进程阻塞的风险。用户线程和轻量级进程的数量比是不定的,是M:N关系。Unix系列的许多操作系统,就采用这种M:N的线程模型。

三,java线程的实现
JDK1.2之前,java线程是基于名为“绿色线程”的用户线程实现的,而在JDK1.2中,线程模型为基于操作系统原生线程模型实现。也就是说,操作系统支持怎样的线程模型,很大程度上决定来java虚拟机的线程是怎样映射的。线程模型只对线程的并发规模和操作成本产生影响,对java程序对编码和运行过程来说,这些差异都是透明的。对于sunJDK来说,它的windows版和linux版都是一比一的线程模型,和系提供的对应。而Solaris平台,则有一对一和多对多两种模型,提供参数选择。

java线程调度

多线程的实现,依赖处理器数量线程调度(一个处理器,同一时时刻只能有一个线程工作,但是通过线程调度,很短一段时间,就是多个线程轮流使用处理器,达到多线程的效果)。

线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种:协同式线程调度抢占式线程调度

  • 协同式线程调度:线程执行时间由线程本身控制,线程自己工作完成后,通知系统进行线程切换。好处:实现简单,切换操作对于线程自己是可知的,不存在什么线程同步问题(单核)。坏处:线程执行时间不可控,会存在线程一直不告知系统进行线程切换的情况。
  • 抢占式线程调度:每个线程由系统分配执行时间,线程的切换不由线程本身决定(java可以通过 Thread.yied()让出执行时间,但不能获取执行时间),这样线程的执行时间是系统可控的,不存在一个线程一直存在的情况。

java线程虽然可以给出优先级建议,但是java线程是要映射到原生线程上的,这就导致二者可能不对应,导致这样的优先级不那么靠谱。

状态转换

java语言定义五种线程状态,任意一时间点,一个线程只能有一种状态。

  • 新建
  • 运行
  • 等待:分为限期(可以自行唤醒)和无限期(被其他线程显式唤醒)
  • 阻塞
  • 结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值