让Java线程长时间处于Runnable状态(例如一小时),是否存在CPU密集型的好方法?
编辑:我正在尝试重现一个错误。我怀疑数据库连接在一段时间后被重置,但线程休眠没有这样做。在我继续讨论其他可能的根本原因之前,我想确保处于可运行状态的线程也不会导致重置连接。 编辑:我找到了一个看起来像一个大胖子的解决方法。如果它对其他人有帮助,可以回答我自己的问题。答案 0 :(得分:2)
处于可运行状态的线程是 在Java虚拟机中执行 但它可能在等待其他 来自操作系统的资源 比如处理器。
让处理器处理其他事情:)
答案 1 :(得分:2)
我不这么认为。线程可以保持可运行的唯一方法是受CPU限制或等待CPU限制的更高优先级线程。
答案 2 :(得分:1)
我想我刚才找到了一种解决方法。
如果我尝试连接到不存在的域,则线程将处于运行状态,直到连接超时(我认为这取决于操作系统)。
try {
new URL("http://thisdomaindoesnotexist.com").
openConnection().
getInputStream().
read();
}
catch (Exception e) {}
在我的机器上大约需要20秒。
System.in InputStream也可以,但我的Web应用程序没有控制台输入。
答案 3 :(得分:0)
如果一个线程是可运行的(在操作系统级别,“runnable”和“在我们说话时实际在CPU上运行”之间通常存在差异),那么迟早会在某个时刻,OS会尝试给它一些CPU时间。有一种无法解决的问题 - 实际上并没有“可运行的类别,但我实际上并没有给它任何CPU时间”。一个潜在的选择可能是给线程一个低优先级:只要明确你的特定系统实际意味着什么(我已经写了一些关于thread priorities的内容以及它们在不同操作系统上的真正含义,以防它有所帮助)。
再看看Thread.yield() - 再次注意,它意味着在不同操作系统上的含义不同。
但是,我从上面的评论中强调 - 我想知道你的操作系统是否只是在一段时间打开后和/或在某个预定的时间关闭所有空闲连接时关闭连接,而不是依赖于线程状态/ CPU的使用。