java中线程的实现、调度

二、java中线程的实现

上面所讲的都是基于操作的线程实现,不同的操作系统中对于线程的实现细节可能会有细微的差别,但是我们都知道java的一大特性就是“write once,run anywhere”,那么在jvm中是怎么实现的呢?

Java线程在JDK 1.2之前,是基于称为“绿色线程”(Green Threads)的用户线程实现的。
在JDK 1.2中,线程模型替换为基于操作系统原生线程模型来实现。因此,在目前的JDK版本中,操作系统支持怎样的线程模型,在很大程度上决定了Java虚拟机的线程是怎样映射的,这点在不同的平台上没有办法达成一致。
线程模型只对线程的并发规模和操作成本产生影响,对Java程序的编码和运行过程来说,这些差异都是透明的。
三、java中线程的调度

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

协同式调度
抢占式调度
协同式调度:线程的执行时间由线程本身决定,线程把自己的工作执行完成后,要主动通知系统交还处理器使用权,再切换到其他的线程。优点:实现简单,而且切换操作对于线程本身是可知的所以不存在线程同步的问题。缺点: 容易死机,系统崩溃。如果其中一个线程作怪,整个系统挂掉。
抢占式调度:每个线程的处理器使用权的时间由系统分配,线程的切换不由本身控制,但是在有用处理器使用权利的时候,可以主动让出(在Java中,Thread.yield()可以让出执行时间,但是要获取执行时间的话,线程本身是没有什么办法的)。这样就算一个一个线程作怪,其他的线程也还是有机会执行的。如果我们希望某个线程可以多执行一下,可以人为的调高自身的线程优先级,不过,线程优先级并不是太靠谱,原因是Java的线程是通过映射到系统的原生线程上来实现的,所以线程调度最终还是取决于操作系统,虽然现在很多操作系统都提供线程优先级的概念,但是并不见得能与Java线程的优先级一一对应。

Java线程调度算法主要依赖于操作系统的线程调度算法。Java虚拟机(JVM)会为每个Java线程创建一个对应的操作系统线程,并通过操作系统的线程调度器来进行调度。 常见的线程调度算法包括: 1. 时间片轮转调度算法:每个线程被分配一个固定大小的时间片,当时间片用完后,调度器会将该线程挂起,继续执行下一个线程。这种算法可以保证每个线程都有公平的执行机会。 2. 优先级调度算法:每个线程被赋予一个优先级,优先级高的线程会被优先执行。这种算法可以根据线程的重要性和紧急性进行调度,但可能存在优先级反转和饥饿问题。 3. 先来先服务调度算法:按照线程请求的先后顺序进行调度,先到达的线程先执行。这种算法简单直观,但可能导致长时间任务阻塞后面的短时间任务。 4. 多级队列调度算法:将线程划分为多个优先级队列,每个队列采用不同的调度算法。例如,可以将高优先级任务放在一个队列,低优先级任务放在另一个队列。这种算法可以根据任务的优先级和类型进行灵活的调度。 需要注意的是,Java线程调度算法受到操作系统的限制和影响,不同的操作系统可能具有不同的线程调度策略。此外,Java也提供了一些线程调度相关的API,如Thread类的yield()方法和sleep()方法,可以在一定程度上影响线程调度行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值