Java 上下文切换时间

Java 上下文切换时间,java,multithreading,Java,Multithreading,我有以下几种情况,我想知道什么时候会发生上下文切换 场景1:java线程调用了对象上的等待,但该线程的时间片仍然保留 场景2:-一个java线程正在等待数据库查询的结果,但该线程的时间片仍然保留 场景3:-一个java线程正在等待数据库查询的结果,但该线程的时间片仍然完成 场景4:-一个java线程正在进行一些计算,但该线程的时间片仍然完成 任何其他情况下,在上下文切换可以发生,但我错过了它 我正在考虑使用这些场景来确定线程池大小是否可以大于Runtime.getRuntime.availabl

我有以下几种情况,我想知道什么时候会发生上下文切换

场景1:java线程调用了对象上的等待,但该线程的时间片仍然保留

场景2:-一个java线程正在等待数据库查询的结果,但该线程的时间片仍然保留

场景3:-一个java线程正在等待数据库查询的结果,但该线程的时间片仍然完成

场景4:-一个java线程正在进行一些计算,但该线程的时间片仍然完成

任何其他情况下,在上下文切换可以发生,但我错过了它

我正在考虑使用这些场景来确定线程池大小是否可以大于Runtime.getRuntime.availableProcessors()
谢谢

如果线程正在执行某些操作,例如调用
wait()
,这意味着时间片没有耗尽。如果线程由于调用
wait()
,或等待I/O结果(包括数据库结果)而被阻塞,则时间片不计算在内。一旦线程被解除阻塞并恢复执行,它就开始计数。如果时间片耗尽,这意味着线程一直在运行,并且没有以任何方式阻塞


因此,您的方案分类不正确。

我正在考虑使用这些方案来确定线程池大小是否可以大于Runtime.getRuntime.availableProcessors()=>您可能应该更详细地解释您的最终目标是什么-因为您的方法可能不合适。上下文切换可以在任何时间的任何地方发生。@assylias-我的想法是,我必须使用线程数w.r.t可用处理器数,如果前者大于后者,则不需要在很大程度上,上下文切换并没有成为一个令人头痛的问题,相反,它是有利的。因此,如果上下文切换发生在场景2中,它实际上是有利的。在同一个或另一个进程中具有更高优先级的另一个线程准备就绪(可能它的IO请求已完成),没有可用的内核来运行它,OS调度程序决定“立即”停止java线程,我的理解是,如果一个线程的时间片结束或者等待I/O结果,则可以将该线程放入CPU。理解正确吗?通常是的。不是
可以
而是
必须
。当被阻塞在
等待
同步
时,也必须将其延迟。若切片结束,并且并没有准备好执行的未阻塞线程,它将立即恢复执行,开始新的时间切片。