[英]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.