网站推广营销策略,一级a做爰片免费网站 小说,百度生成手机网站,长沙网站优化步骤文章目录 12.4 Java与线程12.4.1 线程的实现12.4.2 Java线程调度12.4.3 状态转换 12.4 Java与线程
12.4.1 线程的实现
实现线程主要有三种方式#xff1a;使用内核线程实现#xff08;1#xff1a; 1 实现#xff09;#xff0c;使用用户线程实现#xff08;1#xff… 文章目录 12.4 Java与线程12.4.1 线程的实现12.4.2 Java线程调度12.4.3 状态转换 12.4 Java与线程
12.4.1 线程的实现
实现线程主要有三种方式使用内核线程实现1 1 实现使用用户线程实现1 N 实现使用用户线程加轻量级进程混合实现N M 实现。
1.内核线程实现
使用内核线程实现的方式也被称为 1 1 实现。内核线程Kernel-Level ThreadKLT就是直接由操作系统内核Kernel下称内核支持的线程这种线程由内核来完成线程切换内核通过操纵调度器 Scheduler对线程进行调度并负责将线程的任务映射到各个处理器上。每个内核线程可以视为内核的一个分身这样操作系统就有能力同时处理多件事情支持多线程的内核就称为多线程内核Multi-Threads Kernel。
程序一般不会直接使用内核线程而是使用内核线程的一种高级接口——轻量级进程Light Weight Process LWP轻量级进程就是我们通常意义上所讲的线程由于每个轻量级进程都由一个内核线程支持因此只有先支持内核线程才能有轻量级进程。这种轻量级进程与内核线程之间 1 1 的关系称为一对一的线程模型。 轻量级线程的局限性
由于是基于内核线程实现的所以各种线程操作如创建、析构及同步都需要进行系统调用。而系统调用的代价相对较高需要在用户态 UserMode和内核态Kernel Mode中来回切换每个轻量级进程都需要有一个内核线程的支持因此轻量级进程要消耗一定的内核资源如内核线程的栈空间因此一个系统支持轻量级进程的数量是有限的。
2.用户线程实现
广义上来讲一个线程只要不是内核线程都可以认为是用户线程User Thread UT的一种因此从这个定义上看轻量级进程也属于用户线程但轻量级进程的实现始终是建立在内核之上的许多操作都要进行系统调用因此效率会受到限制并不具备通常意义上的用户线程的优点。 狭义上的用户线程指的是完全建立在用户空间的线程库上系统内核不能感知到用户线程的存在及如何实现的。如果程序实现得当这种线程不需要切换到内核态。
Java、 Ruby 等语言都曾经使用过用户线程最终又都放弃了使用它。但是近年来许多新的、以高并发为卖点的编程语言又普遍支持了用户线程譬如 Golang、 Erlang 等使得用户线程的使用率有所回升。
3.混合实现
线程除了依赖内核线程实现和完全由用户程序自己实现之外还有一种将内核线程与用户线程一起使用的实现方式被称为 N M 实现。 4.Java线程的实现
从 JDK 1.3 起 “主流”平台上的“主流”商用Java 虚拟机的线程模型普遍都被替换为基于操作系统原生线程模型来实现即采用 1 1的线程模型。也就是轻量级线程
以 HotSpot 为例它的每一个 Java 线程都是直接映射到一个操作系统原生线程来实现的而且中间没有额外的间接结构所以 HotSpot 自己是不会去干涉线程调度的可以设置线程优先级给操作系统提供调度建议全权交给底下的操作系统去处理所以何时冻结或唤醒线程、该给线程分配多少处理器执行时间、该把线程安排给哪个处理器核心去执行等都是由操作系统完成的也都是由操作系统全权决定的。
12.4.2 Java线程调度
线程调度是指系统为线程分配处理器使用权的过程调度主要方式有两种分别是协同式Cooperative Threads-Scheduling线程调度和抢占式 Preemptive ThreadsScheduling线程调度。
Java是抢占式调度。
12.4.3 状态转换
Java 语言定义了 6 种线程状态在任意一个时间点中一个线程只能有且只有其中的一种状态并且可以通过特定的方法在不同状态之间转换。这 6 种状态分别是
新建New创建后尚未启动的线程处于这种状态。运行Runnable包括操作系统线程状态中的 Running 和 Ready也就是处于此状态的线程有可能正在执行也有可能正在等待着操作系统为它分配执行时间。无限期等待Waiting包括操作系统线程状态中的 Running 和 Ready也就是处于此状态的线程有可能正在执行也有可能正在等待着操作系统为它分配执行时间。 没有设置 Timeout 参数的 Object::wait()方法没有设置 Timeout 参数的 Thread::join()方法LockSupport::park()方法 限期等待Timed Waiting处于这种状态的线程也不会被分配处理器执行时间不过无须等待被其他线程显式唤醒在一定时间之后它们会由系统自动唤醒。以下方法会让线程进入限期等待状态 Thread::sleep()方法设置了 Timeout 参数的 Object::wait()方法设置了 Timeout 参数的 Thread::join()方法LockSupport::parkNanos()方法LockSupport::parkUntil()方法 阻塞Blocked线程被阻塞了 “阻塞状态”与“等待状态”的区别是“阻塞状态”在等待着获取到一个排它锁这个事件将在另外一个线程放弃这个锁的时候发生而“等待状态”则是在等待一段时间或者唤醒动作的发生。在程序等待进入同步区域的时候线程将进入等待这种状态。结束Terminated已终止线程的线程状态线程已经结束执行。