在Java中创建“后台线程”的方法有很多种。我想分离出一个在后台持续运行的线程。我为此使用
ScheduledExecutorService
。
我希望该线程以 2 秒的固定间隔运行(在连续执行之间)。该线程对服务进行网络调用,总超时时间为 1 秒。
据我了解,为线程指定优先级是操作系统相关的行为,只是建议操作系统将该线程优先于系统中的其他线程。
如何保证我的线程将继续定期执行(至少每 3 秒一次),尽管 CPU 使用率飙升(例如 >= 70%)?
有办法保证这一点吗?这是一个依赖于平台的问题吗?
你问:
如何保证我的线程将继续定期执行(至少每 3 秒一次),尽管 CPU 使用率飙升(例如 >= 70%)?
没有,根本不保证。
在传统的JVM中,所有代码都在由主机OS创建、管理和调度的本机“平台”线程上执行。该线程何时被安排执行完全取决于主机操作系统,而不是 JVM。每个操作系统实现(macOS、BSD、Linux、AIX、Windows 等)都有自己的线程管理策略和算法。这些策略和算法可能会因版本而异。这些策略和算法可能是动态的,适应运行时不断变化的情况,例如对内存和 CPU 内核的需求。
现在,三秒对于现代计算机来说已经是很长的时间了。因此,您的线程很可能会被安排在每三秒的大部分时间内执行。但没有任何保证。您的线程完全有可能“不”被安排执行三秒或更长时间。显然,由有能力的系统管理员管理部署至关重要,以确保计算机不会负担过重。 就您的数字 70% 而言,请记住当今的计算机具有多个内核。所以六核CPU有600%的能力。 CPU 利用率如 70% 之类的数字意味着甚至没有使用一个核心的计算能力,这意味着大多数核心大部分时间都处于空闲状态。
有办法保证这一点吗?
不,无法保证正常执行。
这是一个与平台相关的问题吗?
每个平台在调度线程在内核上执行方面的行为都会有所不同。但总体来说效果是相似的。每个操作系统都希望尽可能多地服务线程。每个操作系统都希望尽可能有效地利用所有可用资源。