请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于java的线程调度策略

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

正在回答 回答被采纳积分+3

2回答

天道酬勤ksl 2020-04-14 06:24:38

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

0 回复 有任何疑惑可以回复我~
Jimin 2019-09-29 09:59:38

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

0 回复 有任何疑惑可以回复我~
  • 提问者 Heyh #1
    我查阅了相关资料得到一种说法,是java的线程调度策略是抢占式的这个又相对于谁而言呢,和系统的线程调度策略之间又有是怎样的关系呢?另外现在的CPU都是多核心的同一时刻处理的线程应该等于核心数吧
    回复 有任何疑惑可以回复我~ 2019-09-29 22:38:43
  • Jimin #2
    抢占式调度常见的现象是某个进程运行时间太长了,是时候切换到另一个进程了。同一时刻每个cpu核心只会运行一个线程,但是不要当作概念记,因为总有特殊情形在,比如具备超线程技术的CPU可以在CPU上维持多个线程
    回复 有任何疑惑可以回复我~ 2019-09-30 09:47:56
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信