首先,我们来说一下两种不同的线程调度方式:

 

所有的Java虚拟机都有一个线程调度器,用来确定那个时刻运行那个线程。主要包含两种:抢占式线程调度器和协作式线程调度器。

1.抢占式线程调度,每个线程可能会有自己的优先级,但是优先及并不意味着高优先级的线程一定会被调度,而是由cup随机的选择,所谓抢占式的线程调度,就是说一个线程在执行自己的任务时,虽然任务还没有执行完,但是cpu会迫使它暂停,让其它线程占有cpu的使用权。

2.协作式线程调度,每个线程可以有自己的优先级,但优先级并不意味着高优先级的线程一定会被最先调度,而是由cpu时机选择的,所谓协作式的线程调度,就是说一个线程在执行自己的任务时,不允许被中途打断,一定等当前线程将任务执行完毕后才会释放对cpu的占有,其它线程才可以抢占该cpu。

 

二者的比较:抢占式线程调度不易发生饥饿现象,不易因为一个线程的问题而影响整个进程的执行,但是其频繁阻塞与调度,会造成系统资源的浪费。协作式的线程调度很容易因为一个线程的问题导致整个进程中其它线程饥饿

 

 

那么Java到底采用的是哪一种线程调度的方式呢?

 

 

1.偏向于抢占式线程调度。

 

这篇博客来自于一个我的疑问,我在读《深入理解Java虚拟机》——周志明,的时候,发现在说上说,“Java使用的线程调度方式就是抢占式调度”。其实当时我还是很赞同的,毕竟多线程环境下,线程的执行确实是交替执行的。

 

 

书中的原始描述:

 

2.再听“Java线程是协作式调度的”。

 

在我看一个视频的时候,“那个老师”在讲Thread类的方法的时候,说“Java线程是协作式调度的” ,这让我倍感疑惑。我请教了几个在我眼里比较牛逼的大佬,但是终没有得到一个满意的答案,在网上搜啊搜,也是什么都没有。其实这个老师在我的眼里水平是很可以的,我不认为他会在这么基础的知识点上犯错,但是问题又摆在这里,到底是谁错了呢?我想,最有可能,是我理解错了把!

 

 

 

3.破开心中疑云

 

下面是我的理解:

 

第一个《深入理解Java虚拟机》一书中所说的Java采用抢占式线程调度,是对的,但是他是站在JVM的层面上说的,是站在线程调度的角度来说的,确实,在JVM层面上,我们的线程都是由JVM负责调度与打断的,当某个线程的时间片用完了,JVM就会剥夺其对CPU的使用权,交给另一个线程使用(这里就可以理解为抢占)。

 

第二个,“那个老师”Java线程是协作式的,也是对的,但是他是站在Java api的层面上来说的,是站在多线程并发运行的角度来说的,确实,你会发现,一个线程调用另一个线程的interrupt() 方法中断线程,并不是强行关闭这个线程,只是跟这个线程打个招呼,将线程的中断标志位置为true,线程是否中断,由线程本身决定。如果真的想要中断当前线程,我们可以对其“中断标志位”进行判断,如果是true我们就在代码层面上停止当前线程的执行逻辑。这里就充分的体现了线程协作的思想,“你不能强行中断我,只要我主动放弃你才能占有我的cpu”

 

总结:

1.Java在调度机制上采用的时抢占式的线程调度机制。

2.Java线程在运行的过程中多个线程之间式协作式的。

 

 

ps:还是要好好感悟一下的,慢慢理解了,也就慢慢简单清晰了。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐