繁体   English   中英

Java线程扩展了可运行状态

[英]Java threads extended runnable state

有没有一种好方法,使Java线程长时间处于Runnable状态(例如一小时),而不会占用大量CPU?

编辑:我试图重现一个错误。 我怀疑一段时间后会重置数据库连接,但是线程睡眠没有执行该操作。 在继续探讨其他可能的根本原因之前,我想确保处于可运行状态的线程也不会导致连接被重置。

编辑:我发现了一个变通办法,看起来像个大胖子。 将答案发布到我自己的问题上是否对其他人有帮助。

处于可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统(例如处理器)的其他资源。

让处理器处理其他事情:)

我不这么认为。 线程保持可运行状态的唯一方法是与CPU绑定,或者等待与CPU绑定的更高优先级的线程。

我想我刚刚找到了解决方法。

如果我尝试连接到不存在的域,则该线程将处于运行状态,直到连接超时(我认为这取决于操作系统)。

try {
    new URL("http://thisdomaindoesnotexist.com").
    openConnection().
    getInputStream().
    read();
} 
catch (Exception e) {}

在我的机器上,这大约需要20秒。

System.in InputStream也可以工作,但是我的Web应用程序没有控制台输入。

如果线程是可运行的(在操作系统级别,“可运行的”与“实际上我们所说的实际上在CPU上运行”之间通常会有区别),那么操作系统迟早会尝试给它一些CPU时间。 几乎没有办法-实际上没有“可运行,但我实际上不给它任何CPU时间”的类别。 一个可能的选择是给线程一个低优先级:只需弄清楚它在您的特定系统上的实际含义(我已经写了一些关于线程优先级的信息 ,以及它们在不同操作系统上的实际含义,以防它有帮助)。

还要看看Thread.yield() -再次注意,它在不同操作系统上的含义不同。

但是,我在上面的评论中强调–我想知道您的操作系统是否只是在打开某个时间之后和/或在某个预定的时间关闭所有空闲连接而关闭连接,而不是取决于线程状态/ CPU使用率。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM