Java线程扩展了runnable状态

时间:2011-01-20 18:58:31

标签: java multithreading

让Java线程长时间处于Runnable状态(例如一小时),是否存在CPU密集型的好方法?

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

编辑:我找到了一个看起来像一个大胖子的解决方法。如果它对其他人有帮助,可以回答我自己的问题。

4 个答案:

答案 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的使用。