关于java的线程调度策略

来源:9-5 多线程并发与线程安全总结

Heyh

2019-09-28

老师我有一个疑问,就是在多线程情况下,java的线程调度策略是怎样的呢?我查了一下资料,说线程调度策略主要是使用操作系统的策略。那具体是怎样一种策略呢,我查到了几种发生线程切换的情况,1.主动放弃,2.发生阻塞,3.是执行完run方法,,根据这种情况,假设我CPU是12核的 那么同时运行的线程可能是12个线程,我起了46个线程 每个线程里处理的事情都是for循环200次,那么根据上述情况,应该是12个一组执行完了换下一组,因为 没有主动放弃 也没有发生阻塞,,,我的理解可能不对,希望老师能够解答一下

写回答

2回答

天道酬勤ksl

2020-04-14

这个你得看操作系统的书吧 分时系统的时间片 单独的线程调度策略得看具体的实现类吧 比如BlockedQueue下面那一堆都有自己的调度策略 单单问jvm的调度策略太笼统了

0
0

Jimin

2019-09-29

你好,这里面涉及的知识偏多,正常能同时执行线程的个数只有cpu个数那么多,因为每个cpu在同一个时间点只能执行一个线程(这时如果只有一个cpu单线程执行时是不存在线程安全问题的),但实际上我们感觉到的却是多个线程(大于cpu个数)并行执行,这里面主要靠的是操作系统的时间片轮转调度策略,一个线程正常执行一个时间片后就要让出cpu,让其他线程执行,这个时间片很短,以至于人为很难感知到。
时间片是一方面,接下来是线程池的调度。jvm内部执行多线程时,底层是有线程池调度的,当线程池核心线程有空闲的时候,这时候会直接执行,否则会放入到等待队列中等待调度,当等待队列也满的时候,就会执行一定的拒绝策略。
除此,我们还可以根据需要主动使用一些调度策略,比如synchronized、countdownlatch、semaphore、cyclebarrier、reentrantlock等,这些都会影响线程的调度。

0
2
Jimin
抢占式调度常见的现象是某个进程运行时间太长了,是时候切换到另一个进程了。同一时刻每个cpu核心只会运行一个线程,但是不要当作概念记,因为总有特殊情形在,比如具备超线程技术的CPU可以在CPU上维持多个线程
2019-09-30
共2条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程